in odps-sdk/odps-sdk-core/src/main/java/com/aliyun/odps/data/converter/ComplexObjectConverter.java [68:165]
public Object parse(JsonElement jsonElement, TypeInfo typeInfo, OdpsRecordConverter formatter) {
if (jsonElement.isJsonNull()) {
return null;
}
switch (typeInfo.getOdpsType()) {
case ARRAY:
if (!(formatter.objectConverterMap.get(OdpsType.ARRAY) instanceof ComplexObjectConverter)) {
// user customized converter
return formatter.parseObject(jsonElement.getAsString(), typeInfo);
}
List result = new ArrayList();
JsonArray jsonArray = jsonElement.getAsJsonArray();
ArrayTypeInfo arrayTypeInfo = (ArrayTypeInfo) typeInfo;
TypeInfo elementTypeInfo = arrayTypeInfo.getElementTypeInfo();
for (JsonElement e: jsonArray) {
result.add(parse(e, elementTypeInfo, formatter));
}
return result;
case MAP:
if (!(formatter.objectConverterMap.get(OdpsType.MAP) instanceof ComplexObjectConverter)) {
// user customized converter
return formatter.parseObject(jsonElement.getAsString(), typeInfo);
}
Map resultMap = new HashMap();
JsonObject jsonObject = jsonElement.getAsJsonObject();
MapTypeInfo mapTypeInfo = (MapTypeInfo) typeInfo;
TypeInfo keyTypeInfo = mapTypeInfo.getKeyTypeInfo();
TypeInfo valueTypeInfo = mapTypeInfo.getValueTypeInfo();
for (Map.Entry<String, JsonElement> entry: jsonObject.entrySet()) {
Object key = formatter.parseObject(entry.getKey(), keyTypeInfo);
Object value = parse(entry.getValue(), valueTypeInfo, formatter);
resultMap.put(key, value);
}
return resultMap;
case STRUCT:
if (!(formatter.objectConverterMap.get(OdpsType.STRUCT) instanceof ComplexObjectConverter)) {
// user customized converter
return formatter.parseObject(jsonElement.getAsString(), typeInfo);
}
StructTypeInfo structTypeInfo = (StructTypeInfo) typeInfo;
List<Object> values = new ArrayList<>();
JsonObject struct = jsonElement.getAsJsonObject();
for (int i = 0; i < structTypeInfo.getFieldCount(); i++) {
String name = structTypeInfo.getFieldNames().get(i);
TypeInfo valueType = structTypeInfo.getFieldTypeInfos().get(i);
Object value = parse(struct.get(name), valueType, formatter);
values.add(value);
}
return new SimpleStruct(structTypeInfo, values);
case BOOLEAN:
if (!convertToString) {
return jsonElement.getAsBoolean();
}
case TINYINT:
if (!convertToString) {
return jsonElement.getAsByte();
}
case SMALLINT:
if (!convertToString) {
return jsonElement.getAsShort();
}
case INT:
if (!convertToString) {
return jsonElement.getAsInt();
}
case BIGINT:
if (!convertToString) {
return jsonElement.getAsLong();
}
case FLOAT:
if (!convertToString) {
return jsonElement.getAsFloat();
}
case DOUBLE:
if (!convertToString) {
return jsonElement.getAsDouble();
}
case DECIMAL:
if (!convertToString) {
return jsonElement.getAsBigDecimal();
}
default:
return formatter.parseObject(jsonElement.getAsString(), typeInfo);
}
}