【问题标题】:What is the cleanest way to unwrap nested JSON values with Jackson in Java?在 Java 中使用 Jackson 解开嵌套 JSON 值的最简洁方法是什么?
【发布时间】:2021-07-16 15:25:42
【问题描述】:

我有一个如下所示的 JSON(为了举例,字段数量大大减少):

{
  "content": {
    "id": {"content": "1"},
    "param1": {"content": "A"},
    "param2": {"content": "55"}
  }
}

请记住,我无法控制它,我无法更改它,这就是我从 API 获得的。

我为此创建了一个 POJO 类,如下所示:

public class PojoClass {
  private String id;
  private String param1;
  private String param2;

  // getters and setters
}

然后我用Jackson解析JSON(我必须用它,请不要建议GSON或其他):

ObjectMapper om = new ObjectMapper();
JsonNode jsonNode = om.readTree(json).get("content");
PojoClass table = om.readValue(jsonNode.toString(), PojoClass.class);

这不起作用,因为 id、param1 和 param2 中包含 JSON,而不是直接值。该代码适用于 JSON,如下所示:

{
  "content": {
    "id": "1",
    "param1": "A",
    "param2": "55"
  }
}

但不幸的是,我需要的值存储在“内容”字段下。

解决这个问题最干净的方法是什么?

我知道我可以对此进行硬编码并在构造函数或其他东西中将所有值一个一个地提取到变量中,但是它们有很多,而不仅仅是像这个例子中的 3 个,显然这不是正确的方法.

【问题讨论】:

    标签: java json jackson jsonnode


    【解决方案1】:

    您可以在 json 字符串中将 JsonNode 元素(如 "id": {"content": "1"})修改为 {"id": "1"},使用迭代器将它们作为 ObjectNode 元素访问,然后反序列化获得的新 json {"id":"1","param1":"A","param2":"55"},如下所示:

    String content = "content";
    ObjectMapper om = new ObjectMapper();
    JsonNode root = om.readTree(json).get(content);
    
    Iterator<String> it = root.fieldNames();
    while (it.hasNext()) {
        String fieldName = it.next();
        ((ObjectNode)root).set(fieldName, root.get(fieldName).get(content));
    } 
    
    PojoClass table = om.readValue(root.toString(), PojoClass.class);
    System.out.println(table); //it will print PojoClass{id=1, param1=A, param2=55}
    

    【讨论】:

    • 这实际上是有道理的。我不明白,为什么我没有自己想出这个,大声笑。非常感谢
    • @Rinkashikachi 不客气,感谢您的提问,我了解了一些关于jackson 我不知道的信息。
    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2010-10-04
    • 2019-02-18
    相关资源
    最近更新 更多