JSON 有条件地在不同节点上获取值的路径

JSON path to fetch value on a different node conditionally

在下面的JSON例子中,当'contenttype'!='helptext'

时我只需要得到1个ID

我做不到'contenttype'=='textAreaSelectionLong',因为很多其他类型都是可能的。

因为是和id同级的不同节点,不知道怎么写成一个JSON路径表达式

我尝试了下面的 JSON 路径,

$.children[?(@.name=='p')].children[?(@.name=='@id')].text

它给了我,

[
  "id2",
  "id3"
]

但我期待 JSON 路径只能 return id2

下面是此示例所基于的 JSON 的一部分,

{
    "children": [
        {
            "name": "@id",
            "text": "id1",
            "children": []
        },
        {
            "name": "contenttype",
            "text": "question",
            "children": []
        },
        {
            "name": "p",
            "text": "Some random text 1",
            "children": [
                {
                    "name": "contenttype",
                    "text": "textAreaSelectionLong",
                    "children": []
                },
                {
                    "name": "@id",
                    "text": "id2",
                    "children": []
                }
            ]
        },
        {
            "name": "p",
            "text": "Some random text 2",
            "children": [
                {
                    "name": "@id",
                    "text": "id3",
                    "children": []
                },
                {
                    "name": "contenttype",
                    "text": "helptext",
                    "children": []
                }
            ]
        }
    ]
}

谁能告诉我下面的 JSON 路径是否有意义。只是 更新 上述 JSON 路径?

$.children[?(@.name=='p' && @.children[?(@.name=='contenttype')].text!='helptext')].children[?(@.name=='@id')].text

显然,jsonpath.com 似乎没有正确解析它并给我预期的结果。我知道这在逻辑上是有道理的。但是,语法好吗?

如果您正在使用 Jayway JsonPath java port you can use the Filter Operator nin

JSONPath

$.children[?('helptext' nin @.children[*].text)].children[?(@.name=='@id')].text

在线测试工具:Jayway JsonPath Evaluator