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

Java 使用JsonPath有条件地提取JSON中的外部键值,java,json,jsonpath,Java,Json,Jsonpath,以下是我的JSON: { "status": false, "responseData": [{ "data": { "value": "value", "label": "label" }, "type": "HEADING" }, { "data": { "section": "SECTION1", "post

以下是我的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"
}
我用它来提取数据

问题:我想根据节名(例如
节1
)获取所有
类型
值(例如
调用操作


我尝试的是:
$.responseData[*]..(@.section=='SECTION1')].type
,但这给了我
POSTS\u LIST
(显然!),这是内部
类型
,而不是我正在寻找的外部
类型
属性。

您想筛选子级属性,然后返回父级属性

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

{
    "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\u TO\u ACTION”

这是目前JayWay JsonPath支持的而不是,尽管存在与之相关的问题。你可能会投票赞成这个问题和/或考虑提高公关水平。
或者,您必须使用JSON反序列化器(如@Wayne建议的Gson)将JSON反序列化为映射(或类似)结构,然后您可以对其进行筛选,找到匹配项后,返回树以查找您希望检索的数据。

@Wayne嘿,谢谢!如果您知道的话,请您介绍一下GSon实现这一点的方法好吗?创建一个容器类,我们称之为container:
class container{}
,它需要
字符串状态
响应数据[]的变量定义responseData
现在使用变量定义声明
类responseData
,现在使用变量定义
字符串类型创建
类数据
;;完成此操作后,
Container c=(Container)(new GSon().fromJSon(jsonStringOrFile))
然后在ResponseData数组中迭代数组。请注意,您不需要深入到数据类,因为类型保存在ResponseData实例中,所以在ResponseData类中声明
String type
,然后遍历responseData数组,读取每个数组中的
type
变量。对于这个错误,我深表歉意,在发表评论之前,我显然没有很好地阅读JSON代码部分。@Wayne非常感谢,但似乎付出了太多的努力!:P我想我会坚持寻找一个Jayway JsonPath解决方案。我想我在回答你的问题时漏掉了一点。。。第三篇文章,所以我在注意到。。。因为您希望基于节名而不是单纯基于类型变量来检索它,所以我们仍然需要
数据
类,它要求您定义变量
字符串节
,而
响应数据
类要求定义
数据
。迭代并获取所需节的节类型;谢谢你回答这个问题。我在GitHub上对这个问题投了赞成票。您是否知道有任何其他方法/库(Jayway除外)可以帮助我解决这个问题?我不知道JsonPath实现可以处理“向前和向后”移动。我认为使用Gson或Jackson来反序列化到一个构造中,然后你可以过滤和询问它,这是你唯一的解决方案。好的,再次感谢!我将尝试这些解决方案之一。