Java 使用JsonPath有条件地提取JSON中的外部键值
以下是我的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
{
"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来反序列化到一个构造中,然后你可以过滤和询问它,这是你唯一的解决方案。好的,再次感谢!我将尝试这些解决方案之一。