in odps-console-dship/src/main/java/com/aliyun/odps/ship/common/RecordConverter.java [621:700]
private Map<Object, Object> transformMap(JsonObject mapObj, MapTypeInfo typeInfo)
throws UnsupportedEncodingException, ParseException {
TypeInfo keyTypeInfo = typeInfo.getKeyTypeInfo();
TypeInfo valTypeInfo = typeInfo.getValueTypeInfo();
Map<Object, Object> newMap = new LinkedHashMap<>();
for (Map.Entry<String, JsonElement> entry : mapObj.entrySet()) {
String keyStr = entry.getKey();
JsonElement value = entry.getValue();
Object newKey;
Object newValue;
switch (keyTypeInfo.getOdpsType()) {
case MAP:
JsonElement map = jsonParser.parse(keyStr);
if (map.isJsonNull() || (map.isJsonPrimitive() && map.getAsString().equals(nullTag))) {
newKey = null;
} else {
newKey = transformMap(map.getAsJsonObject(), (MapTypeInfo) keyTypeInfo);
}
break;
case ARRAY:
JsonElement array = jsonParser.parse(keyStr);
if (array.isJsonNull() || (array.isJsonPrimitive() && array.getAsString()
.equals(nullTag))) {
newKey = null;
} else {
newKey = transformArray(array.getAsJsonArray(), (ArrayTypeInfo) keyTypeInfo);
}
break;
case STRUCT:
JsonElement struct = jsonParser.parse(keyStr);
if (struct.isJsonNull() || (struct.isJsonPrimitive() && struct.getAsString()
.equals(nullTag))) {
newKey = null;
} else {
newKey = transformStruct(struct.getAsJsonObject(), (StructTypeInfo) keyTypeInfo);
}
break;
default:
newKey = parseValue(keyTypeInfo, keyStr.getBytes(defaultCharset));
}
switch (valTypeInfo.getOdpsType()) {
case MAP:
JsonElement map = jsonParser.parse(value.getAsString());
if (map.isJsonNull() || (map.isJsonPrimitive() && map.getAsString().equals(nullTag))) {
newValue = null;
} else {
newValue = transformMap(map.getAsJsonObject(), (MapTypeInfo) valTypeInfo);
}
break;
case ARRAY:
JsonElement array = jsonParser.parse(value.getAsString());
if (array.isJsonNull() || (array.isJsonPrimitive() && array.getAsString()
.equals(nullTag))) {
newValue = null;
} else {
newValue = transformArray(array.getAsJsonArray(), (ArrayTypeInfo) valTypeInfo);
}
break;
case STRUCT:
JsonElement struct = jsonParser.parse(value.getAsString());
if (struct.isJsonNull() || (struct.isJsonPrimitive() && struct.getAsString()
.equals(nullTag))) {
newValue = null;
} else {
newValue = transformStruct(struct.getAsJsonObject(), (StructTypeInfo) valTypeInfo);
}
break;
default:
newValue = parseValue(valTypeInfo, value.getAsString().getBytes(defaultCharset));
}
newMap.put(newKey, newValue);
}
return newMap;
}