我正在尝试创建一些REST响应的自定义反序列化器。这是返回对象的示例:
"someField": [
{
"key": "foo",
"value": {
"left": "bar_left",
"right": "bar_right"
}
},
{
"key": "foo2",
"value": {
"left": "bar_left2",
"right": "bar_right2"
}
}
],
"anotherField: [
{
"key": "foo3",
"value": {
"left": "bar_left",
"right": "bar_right"
}
},
{
"key": "foo4",
"value": {
"left": "bar_left2",
"right": "bar_right2"
}
}
],
"someMoreField": {}
我想要实现的是根据给定的left
检索right
和key
值(这是唯一的)。
到目前为止,我得到了类似的东西:
List<JsonNode> keys = rootNode.findValues("key");
for (JsonNode keyNode: keys ) {
if (keyNode.asText().equals("foo")) {
System.out.println("NODE FOUND!");
//and here I would like to go one node up:
JsonNode parent = keyNode.getParent(); //such method doesn't exist
System.out.println(parent.get("left"));
}
}
因为JsonNode是单向链接的,所以不可能访问父节点。
有人知道我怎么能有效地迭代/解析JsonNode抛出所有级别所以我可以比较key
值同时保持对父级的引用?
我脑子里有类似的东西:
JsonNode rootNode = //some retrieval blablalbal
JsonNode parent = rootNode;
Iterator<JsonNode> it = rootNode.iterateAllLevels()
while (it.hasNext()) {
JsonNode current = it.next();
if(current.asText().equals("searched key")) {
parent.get("value");
}
parent = current;
}
也许有其他方法可以实现这一目标?
答案 0 :(得分:2)
为了从真正复杂的对象中提取少量值,您需要使用 JSON Path 。我不知道你是否在你的项目中使用它,但这绝对是你问题的正确工具。它只是帮助您根据您的标准找到您的元素。您记下您的查询并找到您的元素
找到有关lib(安装,设置)的信息here。它使用起来非常简单。
根据您的JSON结构,要查找left
和right
,您可以使用以下路径
$..[?(@.key=='myFooValue')].value.left
$..[?(@.key=='myFooValue')].value.rigth
myFooValue
是输入key
的值。
希望它有所帮助。