如何遍历/迭代JsonNode以查找特定节点的父节点

时间:2018-03-23 11:02:11

标签: java jackson deserialization rest-assured

我正在尝试创建一些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检索rightkey值(这是唯一的)。

到目前为止,我得到了类似的东西:

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;
}

也许有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:2)

为了从真正复杂的对象中提取少量值,您需要使用 JSON Path 。我不知道你是否在你的项目中使用它,但这绝对是你问题的正确工具。它只是帮助您根据您的标准找到您的元素。您记下您的查询并找到您的元素

找到有关lib(安装,设置)的信息here。它使用起来非常简单。

根据您的JSON结构,要查找leftright,您可以使用以下路径

  • left:$..[?(@.key=='myFooValue')].value.left
  • 右:$..[?(@.key=='myFooValue')].value.rigth

myFooValue是输入key的值。

希望它有所帮助。