如何用JSONPath获取匹配testval为accept的数组最后元素的number值
问题:获取JSON数组中最后一个符合条件元素的指定属性值
原JSON结构
{ "toplevel": [ { "testval": "accept", "number": 1 }, { "testval": "reject", "number": 2 }, { "testval": "accept", "number": 3 }, { "testval": "reject", "number": 4 } ] }
需求说明
需要从toplevel数组中,获取**最后一个testval属性值为"accept"**的元素的number属性值。目前用$.toplevel[?(@.testval == 'accept')].number能得到结果数组[1,3],但目标是单独获取值3,且只能使用纯JSONPath语法,不能后续处理查询结果或执行多次查询。
解决方案
方案1:反向遍历数组(兼容多数现代JSONPath实现)
利用数组切片将原数组反转,再找到第一个符合条件的元素(即原数组最后一个符合条件的元素),写法如下:
$.toplevel[::-1][?(@.testval == 'accept')][0].number
逻辑说明:[::-1]将toplevel数组反转,此时原数组的最后一个accept元素变成反转数组的第一个符合条件的元素,取索引0的number即可得到3。
方案2:条件判断排除后续符合条件的元素(标准JSONPath兼容)
通过条件判断,筛选出testval为accept且之后没有其他testval为accept的元素的项,写法如下:
$.toplevel[?(@.testval == 'accept' && !$..toplevel[(@.number + 1) to -1][?(@.testval == 'accept')])].number
逻辑说明:判断当前元素之后的所有元素中,不存在testval为accept的项,这样的元素就是原数组中最后一个符合条件的元素。
注意事项
部分老旧的JSONPath实现不支持数组切片([::-1])或复杂条件嵌套,此时优先选择方案2,或使用支持扩展语法的JSONPath库(如JSONPath Plus),这类库可以直接支持$.toplevel[?(@.testval == 'accept')][-1].number的写法(即你之前尝试的写法)。
内容的提问来源于stack exchange,提问作者David Ranney
相关产品推荐
相关产品推荐

