代码之家  ›  专栏  ›  技术社区  ›  Maciej Treder

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

  •  2
  • Maciej Treder  · 技术社区  · 6 年前

    我正在尝试创建一些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抛出 所有级别 所以我可以比较 钥匙 值,同时保留对父级的引用?

    我有这样的想法:

    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 回复  |  直到 6 年前
        1
  •  2
  •   arthur    6 年前

    为了 从真正复杂的对象中提取少量值 ,您需要使用 JSON路径 。我不知道您是否在项目中使用它,但这绝对是解决您问题的正确工具。它只会帮助你 定位 您的元素基于您的标准。你写下你的查询,它就会找到你的元素

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

    根据您的JSON结构 left right ,可以使用以下路径

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

    具有 myFooValue 成为您输入的价值 key

    希望有帮助。