如何用地图将json列表包装到对象中

时间:2018-02-17 20:45:55

标签: java json deserialization

我尝试在没有Spring的普通java中创建api客户端,或者其他框架使用Gson或Codehaus Jackson库。 有许多类型的Json响应。像这样:

{
  "any_name1": {
    "field1": 1,
    "field2": 2
  },
  "any_name2": {
    "field1": 3,
    "field2": 4
  }
  ...
}

它有任何对象名称和相同的字段。 或者这个:

{
    "field1":1,
    "field2":{
        "obj1":{
            "field1":1,
            "field2":2
        }
        ...
    }
 }

它应该可以使用此调用:

AnyTypeResponse response = apiClient.sendRequest(request, AnyTypeResponse.class);

我发送了我想从客户端获得的响应类型。 在第二个json示例中,它很清楚。对象有两个字段,其中一个是列表。 但第一个json示例是对象列表。例如,我不需要列表,但我需要一个带有列表(或地图)的对象。这意味着我需要在一个自定义响应对象中包装对象列表。我怎样才能做到这一点? 现在我使用这种方法:

public <T> T execute(Class<T> clazz) throws Exception {
    ...
    // create HttpUrlConnection and send request
    ...
    return objectMapper.readValue(response.toString(), clazz);
    // or return gson.fromJson(response.toString(), clazz);
}

public class ListTypeResponse {

    private List<AnyObj> objects;

    public ListTypeResponse(List<AnyObj> objects) {
        this.objects = objects;
    }

    public List<AnyObj> getObjects() {
        return objects;
    }
}

但它不起作用。你能救我吗?

1 个答案:

答案 0 :(得分:1)

两种类型的JSON都可以表示为Map<String, Object>,其中Object也可以是Map<String, Object>,依此类推。

使用Gson您可以按如下方式创建此地图:

Map<String, Object> o = gson.fromJson(jsonString, 
                                      new TypeToken<Map<String, Object>>() {}.getType());

我使用调试器来演示Gson如何创建这些嵌套映射。

enter image description here