簡體   English   中英

用 Java 中的 Jackson 解開嵌套的 JSON 值的最干凈方法是什么?

[英]What is the cleanest way to unwrap nested JSON values with Jackson in Java?

我有一個 JSON 看起來像這樣(例如,字段數量大大減少):

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

請記住,我無法控制它,我無法更改它,這就是我從 API 得到的。

我為此創建了一個 POJO class,如下所示:

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 個,顯然這不是正確的方法。

您可以在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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM