JsonPath 常用配置项收集

7

JsonPath 常用配置项收集

一、解析配置(解析 JSON 文本的行为)

Configuration.defaultConfiguration()

返回一个默认的 Configuration 对象,常用于链式配置。

解析配置项如下:

配置项 含义
ALWAYS_RETURN_LIST 无论结果是单个值还是数组,总是返回 List
AS_PATH_LIST 返回 JsonPath 匹配路径而不是值
DEFAULT_PATH_LEAF_TO_NULL 对于不存在的路径,返回 null 而不是抛异常
REQUIRE_PROPERTIES 如果路径中引用了未定义的属性,则抛出异常
SUPPRESS_EXCEPTIONS 抑制所有异常(返回 null)而不是抛出异常

示例:

Configuration config = Configuration.builder()
    .options(Option.ALWAYS_RETURN_LIST, Option.DEFAULT_PATH_LEAF_TO_NULL)
    .build();

Object result = JsonPath.using(config).parse(json).read("$.store.book[*].author");

二、映射配置(将 JSON 映射为 Java 对象)

在解析后,可以将结果映射成 Java Bean 或特定类型,相关配置如下:

配置项 说明
MappingProvider 用于自定义对象映射(默认是 JacksonMappingProvider)
JsonProvider 用于自定义底层 JSON 处理实现(默认是 JacksonJsonProvider)
SetEvaluationListener 监听 JsonPath 表达式的执行情况(一般用于调试)

示例:使用 Jackson 映射为对象

Configuration config = Configuration.builder()
    .mappingProvider(new JacksonMappingProvider())
    .jsonProvider(new JacksonJsonProvider())
    .build();

Book book = JsonPath.using(config).parse(json).read("$.store.book[0]", Book.class);

所有可选项(Option 枚举类):

public enum Option {
    DEFAULT_PATH_LEAF_TO_NULL,
    ALWAYS_RETURN_LIST,
    SUPPRESS_EXCEPTIONS,
    AS_PATH_LIST,
    REQUIRE_PROPERTIES
}

默认使用的实现

组件 默认实现
JsonProvider JacksonJsonProvider
MappingProvider JacksonMappingProvider

如果你使用了 GsonFastjson,也可以自定义对应的 Provider。

MappingProvider

负责对象与 JSON 的映射(序列化、反序列化);

Configuration conf = Configuration.builder()
    .mappingProvider(new JacksonMappingProvider())
    .build();
实现类名 描述 所需依赖
JacksonMappingProvider 默认实现,使用 Jackson Jackson
GsonMappingProvider 使用 Google Gson gson
JsonSmartMappingProvider 使用 json-smart json-smart
JakartaMappingProvider 使用 Jakarta JSON-B (Binding) jakarta.json.bind:jakarta.json.bind-api

JacksonMappingProvider

  • 依赖库:Jackson
  • 详细作用
    • 支持复杂对象映射(泛型、嵌套类);
    • 支持注解如 @JsonProperty, @JsonIgnore
    • 可以将 Map、JsonNode 转换为指定 Java 类型;
  • 配置项支持
    • 自定义 ObjectMapper,支持序列化、反序列化策略;
  • 适合
    • 企业项目;
    • 与 Spring Boot 集成;

GsonMappingProvider

  • 依赖库:Gson
  • 详细作用
    • 使用 Gson 将 JSON 映射为对象;
    • 适合轻量级 Java 项目或 Android;
  • 注意点
    • 泛型嵌套结构反序列化略麻烦,需要 TypeToken

JsonSmartMappingProvider

  • 依赖库:json-smart
  • 详细作用
    • 无复杂类型映射,仅支持基本类型转换;
    • 不支持自动注解或深层映射;
  • 适合
    • 只读取 Map、List,不需要对象模型;

JakartaMappingProvider

  • 依赖库:Jakarta JSON-B

  • 详细作用

    • 支持 Jakarta JSON-B 标准的 @JsonbProperty 等注解;
    • 适用于 Jakarta EE 的 REST 接口与 DTO 映射;
  • 配置项

    • 可注入自定义 Jsonb 实例;

JsonProvider

负责底层 JSON 数据的解析与生成。

Configuration conf = Configuration.builder()
    .jsonProvider(new JacksonJsonProvider())
    .build();
实现类名 描述 所需依赖
JacksonJsonProvider 默认基于 Jackson 的实现 Jackson Core / Databind
GsonJsonProvider 使用 Google Gson 实现 com.google.code.gson:gson
JsonSmartJsonProvider 使用 JSON Smart 实现 net.minidev:json-smart
JakartaJsonProvider 使用 Jakarta JSON-P (JSON Processing) jakarta.json:jakarta.json-api

JacksonJsonProvider

  • 依赖库com.fasterxml.jackson.databind.ObjectMapper

  • 详细作用

    • 使用 Jackson 将 JSON 字符串解析为 Java 对象(Map/List/JsonNode 等);
    • 支持高性能读取;
    • 支持复杂嵌套结构、null 值、日期格式自动识别等;
    • 支持对 JSONPath 结果对象进行进一步操作(如 JsonNode 深度遍历);
  • 优点

    • 高性能;
    • 功能强大;
    • 社区活跃,支持类型注解、自定义序列化;

GsonJsonProvider

  • 依赖库com.google.gson.Gson
  • 详细作用
    • 使用 Gson 将 JSON 解析为 JsonObject, JsonArray, JsonElement
    • 更适合轻量项目和 Android 开发;
  • 优点
    • 小巧,适合移动端;
    • 更容易控制输出格式;
  • 限制
    • 对于大数据量和复杂类型处理不如 Jackson;
    • 不支持如 @JsonView 等高级特性;

JsonSmartJsonProvider

  • 依赖库net.minidev.json.parser.JSONParser(json-smart)
  • 详细作用
    • 超轻量级 JSON 解析;
    • 使用 JSONObject, JSONArray 作为基础类型;
    • 没有复杂的类型映射机制,只支持基本数据类型;
  • 适用场景
    • 只做 JSON 查询;
    • 不需要对象映射;
    • 对包体积要求极小的服务;

JakartaJsonProvider

  • 依赖库jakarta.json.Json, JsonReader, JsonObject
  • 详细作用
    • 实现基于 Jakarta JSON-P(前 javax.json)的 JSON 解析;
    • 更适合 Jakarta EE 标准项目或微服务;
  • 优点
    • 遵循标准;
    • 易集成 Jakarta EE REST 服务;
  • 限制
    • API 不如 Jackson 丰富;

示例:完整配置与调用方式

Configuration conf = Configuration.builder()
    .jsonProvider(new JacksonJsonProvider())
    .mappingProvider(new JacksonMappingProvider())
    .options(Option.ALWAYS_RETURN_LIST)  // 控制解析行为的其他选项
    .build();

List<MyBean> list = JsonPath.using(conf).parse(json).read("$.data[*]", new TypeRef<List<MyBean>>() {});

附:常见错误场景及 Provider 的关系

错误现象 可能原因 解决建议
ClassCastException 使用了 JsonSmartJsonProvider时尝试读取为对象 改为 Jackson/Gson Provider
NullPointerException 使用不匹配的 Provider/Mappper 对 确认两个 Provider 是配套的
无法识别的字段 Jackson 未配置对应注解策略 自定义 ObjectMapper
泛型映射失败 Gson 默认不支持嵌套泛型 使用 TypeToken 或改用 Jackson

进阶功能:

  • 支持 Predicate 进行路径过滤
  • 支持配置缓存策略
  • 支持动态路径组合
  • 支持全局 Configuration.setDefaults(...)