private Map transformMap()

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