public Object parse()

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