如何用JsonPath获取过滤后数组的长度?是否可行?
用JsonPath获取过滤后数组的长度当然可行!
你的思路完全没问题,但原表达式有个小语法问题,咱们来修正下,同时针对不同的JsonPath实现给你对应写法:
首先先明确你的目标JSON数据:
{ "issues": [ { "severity": "MAJOR" }, { "severity": "MINOR" }, { "severity": "MAJOR" }, { "severity": "MAJOR" }, { "severity": "MAJOR" } ] }
常见的正确写法(以Jayway JsonPath为例,Java生态最常用)
Jayway是目前应用最广的JsonPath实现,它支持直接在过滤后的数组上调用size()或length()来获取长度:
- 直接链式调用
$.issues[?(@.severity == 'MAJOR')].size() - 通过根节点计算长度
$[length($.issues[?(@.severity == 'MAJOR')])]
这两个表达式针对你的JSON都会返回4,正好对应4个severity为MAJOR的条目。
你原表达式的问题
你写的$.issues.[?(@.severity == 'MAJOR')].length()里,$.issues后面多了一个不必要的点,去掉这个点后,再根据所用的JsonPath实现替换正确的长度方法(比如Jayway用size()更稳妥,部分实现也支持length())就可以正常工作了。
原始JsonPath规范的说明
如果是遵循Goessner原始JsonPath规范的实现,本身没有内置的长度函数,这种情况下你需要先通过$.issues[?(@.severity == 'MAJOR')]获取过滤后的数组,再在你的代码逻辑里去读取这个数组的长度值。
内容的提问来源于stack exchange,提问作者Matthis.h




