如何通过子节点匹配获取JSONPath中的父节点number字段?
JSONPath查询嵌套数组的匹配问题
目标JSON
[ { "number": "5422", "sender": [ { "id": "6001" }, { "id": "7371" } ], "receiver": [ { "id": "6205" }, { "id": "3803" }, { "id": "5601" } ] } ]
查询需求
筛选出sender数组中存在指定id、且receiver数组中存在另一指定id的条目,返回对应的number字段值,全程使用JSONPath完成,不修改原文件。
失败原因分析
你之前的查询写法错误在于:sender和receiver是数组结构,直接用@.sender.id会返回该数组所有元素的id集合,无法直接与单个值做相等判断,必须明确检查数组中是否存在符合条件的元素。
正确查询表达式
以下是几种适配不同JSONPath实现的有效写法:
写法1(支持exists关键字的实现,如Jayway)
$[?(exists(@.sender[?(@.id == '6001')]) && exists(@.receiver[?(@.id == '6205')]))].number
逻辑:先判断sender数组中是否存在id为'6001'的元素,同时receiver数组中存在id为'6205'的元素,再提取对应number。
写法2(支持contains关键字的实现)
$[?(@.sender[*].id contains '6001' && @.receiver[*].id contains '6205')].number
逻辑:检查sender数组的所有id集合是否包含目标值,同时receiver的id集合也包含对应目标值。
写法3(支持any关键字的实现)
$[?(any(@.sender, @.id == '6001') && any(@.receiver, @.id == '6205'))].number
逻辑:用any判断数组中是否存在至少一个元素满足id匹配条件。
以上表达式都能正确返回符合条件的"5422"。
内容的提问来源于stack exchange,提问作者user21448519
相关产品推荐
相关产品推荐

