使用 JsonPath 在 JSON 中有条件地提取外部键值

Conditionally extracting outer key-value in a JSON using JsonPath

这是我的 JSON:

{
    "status": false,
    "responseData": [{
        "data": {
            "value": "value",
            "label": "label"
        },
        "type": "HEADING"
    }, {
        "data": {
            "section": "SECTION1",
            "post": {}
        },
        "type": "POST"
    }, {
        "data": {
            "section": "SECTION1",
            "post": {}
        },
        "type": "POST"
    }, {
        "data": {
            "section": "SECTION1",
            "post": {}
        },
        "type": "POST"
    }, {
        "data": {
            "section": "SECTION1",
            "value": "value",
            "label": "label",
            "type": "POSTS_LIST",
            "headerDetails": {
                "value": "value",
                "label": "label"
            },
            "metaData": {
                "params": {
                    "param1": "value1",
                    "param2": "value2"
                }
            }
        },
        "type": "CALL_TO_ACTION"
    }],
    "message": "OK"
}

我正在使用 Jayway JsonPath 进行数据提取。

问题:我想根据部分名称(例如 SECTION1)获取所有 type 值(例如 CALL_TO_ACTION)。

我在 https://jsonpath.curiousconcept.com 上尝试的内容:$.responseData[*].[?(@.section=='SECTION1')].type,但这给了我 POSTS_LIST(很明显!),这是内部 type 而不是外部 type 我正在寻找的属性。

您想过滤子级属性,然后 return 父级属性。

更具体地说,在下面的例子中...

{
    "data": {
        "section": "SECTION1",
        "value": "value",
        "label": "label",
        "type": "POSTS_LIST",
        "headerDetails": {
            "value": "value",
            "label": "label"
        },
        "metaData": {
            "params": {
                "param1": "value1",
                "param2": "value2"
            }
        }
    },
    "type": "CALL_TO_ACTION"
}

...子级属性为"section": "SECTION1",父级属性为"type": "CALL_TO_ACTION"

这是 JayWay JsonPath 当前支持的,尽管有一个与之相关的open issue。您或许可以对该问题投赞成票 and/or 考虑为其提出 PR。

或者,您必须使用 JSON 反序列化器(例如@Wayne 建议的 Gson)将您的 JSON 反序列化为 Map(或类似)构造,然后您可以对其进行过滤找到你的匹配项后,沿着树往回走,找到你想要检索的数据。