You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:42:27