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);
}