如何使用JSONPath按子数组inplay属性过滤获取根数组完整sport对象
正确JSONPath表达式
对于你描述的场景,兼容绝大多数主流JSONPath解析器(如Jayway、jsonpath-ng、JSONPath-Plus)的写法如下:
$[?(@.regions[?(@.leagues[?(@.inplay == 0)])])]
原写法失效原因
你之前尝试的$[?(@.regions[*].leagues[*].inplay == 0)]无法生效,是因为regions[*].leagues[*].inplay在过滤条件中返回的是值数组,大部分JSONPath解析器不支持直接用数组和单个值做相等性判定,因此会始终返回false。
正确写法逻辑
嵌套过滤的逻辑是逐层判定是否存在符合要求的子元素:
- 最内层
@.leagues[?(@.inplay == 0)]:筛选单个地区下所有inplay=0的联赛,只要存在匹配项就返回非空数组 - 中间层
@.regions[?()]:筛选当前运动项目下存在符合要求联赛的地区,只要有一个地区满足就返回非空数组 - 最外层过滤条件只要中间层返回非空,就判定当前运动项目符合要求,返回完整对象
将该表达式代入你提供的测试JSON运行,会准确返回name为Tennis的完整sport对象,符合你的预期。
小提示:如果你使用的JSONPath解析器不支持嵌套过滤,可尝试对应解析器的数组包含语法,例如Jayway实现下可写为
$[?(@.regions[*].leagues[*].inplay contains 0)]。
内容的提问来源于stack exchange,提问作者Anton Nordhagen
相关产品推荐
相关产品推荐

