JSONPath数组路径非空校验方法 解决空数组访问报错问题
根因说明
你配置的Option.SUPPRESS_EXCEPTIONS本身无法覆盖数组索引越界后继续访问属性的场景:该选项仅会在路径遍历遇到不存在的对象属性时返回null,当book数组为空时,访问[0]会先拿到null值,后续继续读取这个null值的author属性时,JsonSmartJsonProvider会判定当前节点不是合法JSON对象,直接抛出PathNotFoundException,这个异常不会被SUPPRESS_EXCEPTIONS拦截。
可行解决方案
- 方案1:使用空安全路径语法
在数组索引访问后增加?操作符,标记该节点为空时直接返回null,不再继续向下遍历属性,无需修改原有配置。代码示例:// 修改路径即可,空数组场景下返回null,不会抛出异常 String author = JsonPath.read(document, "$.store.book[0]?.author"); - 方案2:补充路径空值返回配置
新增Option.DEFAULT_PATH_LEAF_TO_NULL配置项,和原有SUPPRESS_EXCEPTIONS搭配使用,该配置会让所有路径节点不存在(包括数组索引越界、属性缺失、节点为null)的场景统一返回null,不会抛出异常。代码示例:Configuration conf = Configuration.builder() .jsonProvider(new JsonSmartJsonProvider()) // 新增DEFAULT_PATH_LEAF_TO_NULL配置 .options(Option.SUPPRESS_EXCEPTIONS, Option.DEFAULT_PATH_LEAF_TO_NULL) .build(); Object document = conf.jsonProvider().parse(objectInArray.toString()); // 原有路径无需修改,空数组时author返回null String author = JsonPath.read(document, "$.store.book[0].author"); - 方案3:提前校验数组长度
先单独读取book数组,判断数组非空、长度满足要求后再读取目标属性,完全不依赖JsonPath的异常控制逻辑,可读性和稳定性最高。代码示例:List<?> bookList = JsonPath.read(document, "$.store.book"); String author = null; if (bookList != null && !bookList.isEmpty()) { author = JsonPath.read(document, "$.store.book[0].author"); }
提示:如果你使用的是2.4.0及更早版本的Jayway JsonPath,空安全操作符
?存在兼容问题,建议选择方案2或方案3。
内容的提问来源于stack exchange,提问作者Metalhead
相关产品推荐
相关产品推荐

