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

时间:2017-12-06 09:32:15

标签: java json 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进行数据提取。

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

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

1 个答案:

答案 0 :(得分:0)

您希望过滤子级属性,然后返回父级属性。

更具体地说,在以下示例中......

{
    "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与之相关。你或许可以提出问题和/或考虑为它提出公关。

或者,您必须使用JSON反序列化器(例如@Wayne建议的Gson)将您的JSON反序列化为Map(或类似)构造,然后您可以过滤并找到您的匹配步骤返回树找到你想要检索的数据。