如何在Jayway实现的JsonPath中筛选缺失指定字段的元素
在Jayway JsonPath中筛选缺失特定字段的数组元素
针对你提出的问题——在Java实现的Jayway JsonPath中筛选缺失isbn字段的书籍,你尝试的$.store.book[?(@.isbn empty true)]无效,确实是因为Jayway对empty谓词的处理逻辑和预期不符:它仅针对存在但为空的字段生效,对完全不存在的字段不适用。
下面是两种可靠的解决方案:
方法1:利用字段不存在时的布尔特性
当访问一个不存在的字段时,Jayway会将其视为false,因此可以通过取反来选中这些元素:
$.store.book[?(!(@.isbn))]
方法2:使用exists()函数(更直观)
Jayway支持exists()函数,直接判断字段是否存在,取反即可筛选缺失字段的元素:
$.store.book[?(!exists(@.isbn))]
测试验证
针对你提供的JSON数据:
{ "store" : { "book" : [ { "category" : "reference", "author" : "Nigel Rees", "title" : "Sayings of the Century", "price" : 8.95 }, { "category" : "fiction", "author" : "Evelyn Waugh", "title" : "Sword of Honour", "price" : 12.99 }, { "category" : "fiction", "author" : "Herman Melville", "title" : "Moby Dick", "isbn" : "0-553-21311-3", "price" : 8.99 }, { "category" : "fiction", "author" : "J. R. R. Tolkien", "title" : "The Lord of the Rings", "isbn" : "0-395-19395-8", "price" : 22.99 } ], "bicycle" : { "color" : "red", "price" : 19.95 } }, "expensive" : 10 }
上述两个表达式都会返回前两本没有isbn字段的书籍,符合预期。
补充说明:你之前用
empty(false)返回结果,是因为它匹配了存在且非空的字段,和你的需求完全相反;而null判断无效,是因为Jayway不会将不存在的字段视为null,仅当字段存在且值为null时才会匹配。
内容的提问来源于stack exchange,提问作者Dmitry E.
相关产品推荐
相关产品推荐

