【问题标题】:How to wrap json list to object with map [closed]如何使用地图将json列表包装到对象[关闭]
【发布时间】:2018-02-17 20:45:54
【问题描述】:

我尝试在没有 Spring 或其他框架的情况下使用 Gson 或 Codehaus Jackson 库在纯 java 中创建 api 客户端。 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;
    }
}

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

【问题讨论】:

标签: java json deserialization


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢。它看起来像我需要的。但结果是地图。如何创建一个包含此地图的结果对象?
  • @Virkom 您可以拥有一个带有Map&lt;String, Object&gt; 字段的对象并像new Result(map) 一样创建它
  • 喜欢您的ListTypeResponse ,但使用Map 而不是List
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多