java - 如何使用 map 将 json 列表包装到对象

标签 java json deserialization

<分区>

我尝试在没有 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 示例是对象列表。例如,我不需要列表,但我需要一个包含列表(或 map )的对象。这意味着我需要将对象列表包装在一个自定义响应对象中。我怎样才能做到这一点? 现在我使用这个方法:

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

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

最佳答案

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

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

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

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

enter image description here

关于java - 如何使用 map 将 json 列表包装到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845780/

相关文章:

java - 使用 ObjectInputStream 读入的对象在 try-catch block 后不保留值

java - 如何使用递归计算树中的最高级别?

java - 无法在 Java 中反序列化 MultivaluedHashMap<String, String>

c# - 使用 XmlMessageFormater 序列化的消息拒绝反序列化 List<T> 成员

java - jackson 反序列化器 - 获取模型字段注释列表

java - Eclipse Neon - 内容辅助超时

java - BlockingQueue 的 take() 方法的延迟是多少?

json - 如何在将 String 映射到 Int 或 String 的 Swift 中保存字典的 JSON 数组?

java - 解析 JSON 时出现 NullPointerException

python加载json数据错误