java - Jackson Json遍历封装树

时间:2016-07-27 23:34:59

标签: java json tree jackson traversal

我有这样的架构(简化):

{
  "range": {
    "offset": 0,
    "limit": 1,
    "total": 2
  },
  "items": [
    {
      "id": 11,
      "name": "foo",
      "children": [
        {
          "id": 112,
          "name": "bar",
          "children": [
            {
              "id": 113,
              "name": "foobar",
              "type": "file"
            }
          ],
          "type": "folder"
        },
        {
          "id": 212,
          "name": "foofoo",
          "type": "file"
        }
      ],
      "type": "room"
    },
    {
      "id": 21,
      "name": "barbar",
      "type": "room"
    }
  ]
}

我需要只读取第一个房间(项目)中的“id”等特定值。为此,我需要使用类型文件夹或文件遍历每个级别上的所有项目(n项为root,n项为n个子项)。

现在我有了这段代码:

POJO

public static class Item {
  public int id;
}

Jackson Tree Iteration

ObjectMapper mapper = new ObjectMapper();
com.fasterxml.jackson.databind.JsonNode root = mapper.readTree(JSON);
root = root.get("items").get(0);
TypeReference<List<Item>> typeRef = new TypeReference<List<Item>>(){};
List<Item> list = mapper.readValue(root.traverse(), typeRef);
for (Item f : list) {
    System.out.println(f.id);
}

如何获得具有特定类型的所有项目中所有孩子的所有ID? 如何在不定义整个模式的情况下避免“无法识别的字段”异常?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

尝试使用java8函数,它可以用较少的行来完成它,

ObjectMapper mapper = new ObjectMapper();
Pass your json value 
Map obj = mapper.readValue(s, Map.class);

List<Object> items= (List<Object>) obj.get("items");
Object[] Ids= items
.stream()
.filter(items-> ((Map)items).get("type").equals("room"))
.toArray()

答案 1 :(得分:0)

使用 readTree(...)方法解析JSON,而无需定义整个架构,并找到名为&#34; id&#34;的节点。

然后,您可以使用 findValues(&#34; id&#34;)来获取值列表。