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

访问值为Null的JSON键时抛出JSONArray[0] not found异常求助

问题解决:JsonPath访问null值键抛出JSONArray异常

问题重现

代码示例:

JSONObject json = new JSONObject(""" { "key": null } """);
Configuration config = Configuration.builder()
    .options(Option.SUPPRESS_EXCEPTIONS, Option.DEFAULT_PATH_LEAF_TO_NULL)
    .jsonProvider(new JsonOrgJsonProvider())
    .build();

JsonPath.using(config).parse(json).read("key"); // 执行时抛出异常

触发的异常信息:

Exception in thread "main" com.jayway.jsonpath.JsonPathException: org.json.JSONException: JSONArray[0] not found

问题原因

JsonOrgJsonProvider在处理值为null的属性时,内部逻辑错误地将其识别为JSONArray类型,进而尝试访问数组索引0,导致抛出异常。而DEFAULT_PATH_LEAF_TO_NULL选项仅能处理JsonPath层面的路径不存在场景,无法覆盖底层Provider的逻辑错误。

解决方案

方案1:替换为JacksonJsonProvider

改用Jackson实现的JsonProvider可以规避该问题,它对null值的处理更符合JsonPath的预期:

// 需确保项目引入Jackson相关依赖
JSONObject json = new JSONObject(""" { "key": null } """);
Configuration config = Configuration.builder()
    .options(Option.SUPPRESS_EXCEPTIONS, Option.DEFAULT_PATH_LEAF_TO_NULL)
    .jsonProvider(new JacksonJsonProvider())
    .build();

Object result = JsonPath.using(config).parse(json).read("key"); // 正常返回null,无异常

方案2:自定义修复JsonOrgJsonProvider

如果必须使用JsonOrgJsonProvider,可以继承它并重写数组索引访问方法,提前处理null值:

public class FixedJsonOrgJsonProvider extends JsonOrgJsonProvider {
    @Override
    public Object getArrayIndex(Object obj, int index) {
        if (obj == null) {
            return null;
        }
        return super.getArrayIndex(obj, index);
    }
}

// 使用自定义Provider
Configuration config = Configuration.builder()
    .options(Option.SUPPRESS_EXCEPTIONS, Option.DEFAULT_PATH_LEAF_TO_NULL)
    .jsonProvider(new FixedJsonOrgJsonProvider())
    .build();

内容的提问来源于stack exchange,提问作者Arun Pandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:24:52