我有这样的架构(简化):
{
"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? 如何在不定义整个模式的情况下避免“无法识别的字段”异常?
非常感谢你的帮助!
答案 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;)来获取值列表。