访问值为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
相关产品推荐
相关产品推荐

