private Struct transformStruct()

in odps-console-dship/src/main/java/com/aliyun/odps/ship/common/RecordConverter.java [702:746]


  private Struct transformStruct(JsonObject structObj, StructTypeInfo typeInfo)
      throws UnsupportedEncodingException, ParseException {

    List<Object> values = new ArrayList<>();
    List<TypeInfo> fieldTypeInfos = typeInfo.getFieldTypeInfos();

    int index = 0;
    for (Map.Entry<String, JsonElement> entry : structObj.entrySet()) {
      TypeInfo fieldTypeInfo = fieldTypeInfos.get(index++);
      JsonElement element = entry.getValue();

      switch (fieldTypeInfo.getOdpsType()) {
        case ARRAY:
          JsonElement array = jsonParser.parse(element.getAsString());
          if (array.isJsonNull() || (array.isJsonPrimitive() && array.getAsString()
              .equals(nullTag))) {
            values.add(null);
          } else {
            values.add(transformArray(array.getAsJsonArray(), (ArrayTypeInfo) fieldTypeInfo));
          }
          break;
        case MAP:
          JsonElement map = jsonParser.parse(element.getAsString());
          if (map.isJsonNull() || (map.isJsonPrimitive() && map.getAsString().equals(nullTag))) {
            values.add(null);
          } else {
            values.add(transformMap(map.getAsJsonObject(), (MapTypeInfo) fieldTypeInfo));
          }
          break;
        case STRUCT:
          JsonElement struct = jsonParser.parse(element.getAsString());
          if (struct.isJsonPrimitive() && struct.getAsString().equals(nullTag)) {
            values.add(null);
          } else {
            values.add(transformStruct(struct.getAsJsonObject(), (StructTypeInfo) fieldTypeInfo));
          }
          break;
        default:
          values.add(parseValue(fieldTypeInfo, element.getAsString().getBytes(defaultCharset)));
          break;
      }
    }

    return new SimpleStruct(typeInfo, values);
  }