使用带星号数组后,JsonPath路径不存在时未抛出异常咨询
问题分析
Jayway JsonPath默认采用宽松配置模式,当通过[*]遍历数组元素时,若某个元素不存在指定的属性键,会直接跳过该元素而不抛出异常。当所有数组元素都缺失目标键时,最终会返回空列表,而非抛出PathNotFoundException。
解决方案
要实现不存在属性键时抛出异常的需求,需修改JsonPath的配置,启用REQUIRE_PROPERTIES选项。该选项会强制校验路径中指定的属性必须存在,否则触发异常。
修改后的代码示例
package main.java; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Option; public class CheckValidPath { public static void main(String[] args) { String json = "{\n" + " \"store\": {\n" + " \"book\": [\n" + " {\n" + " \"category\": \"reference\",\n" + " \"author\": \"Nigel Rees\",\n" + " \"title\": \"Sayings of the Century\",\n" + " \"price\": 8.95\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"Evelyn Waugh\",\n" + " \"title\": \"Sword of Honour\",\n" + " \"price\": 12.99\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"Herman Melville\",\n" + " \"title\": \"Moby Dick\",\n" + " \"isbn\": \"0-553-21311-3\",\n" + " \"price\": 8.99\n" + " },\n" + " {\n" + " \"category\": \"fiction\",\n" + " \"author\": \"J. R. R. Tolkien\",\n" + " \"title\": \"The Lord of the Rings\",\n" + " \"isbn\": \"0-395-19395-8\",\n" + " \"price\": 22.99\n" + " }\n" + " ],\n" + " \"bicycle\": {\n" + " \"color\": \"red\",\n" + " \"price\": 19.95\n" + " }\n" + " },\n" + " \"expensive\": 10\n" + "}"; // 配置启用REQUIRE_PROPERTIES选项 Configuration config = Configuration.builder() .options(Option.REQUIRE_PROPERTIES) .build(); // 正确路径可正常执行 System.out.println(JsonPath.using(config).parse(json).read("$.store.book[*].author").toString()); // 错误路径会抛出PathNotFoundException System.out.println(JsonPath.using(config).parse(json).read("$.store.book[*].anyRandomKey").toString()); } }
补充说明
Option.REQUIRE_PROPERTIES会强制JsonPath校验路径中所有属性的存在性,一旦发现缺失的属性,立即抛出PathNotFoundException。- 若需要更严格的校验规则,还可以结合
FAIL_ON_MISSING_PROPERTY等其他选项,但REQUIRE_PROPERTIES已能满足当前场景的核心需求。
内容的提问来源于stack exchange,提问作者Apurv Upreti
相关产品推荐
相关产品推荐

