JsonPath 常用配置项收集
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 |
如果你使用了 Gson
或 Fastjson
,也可以自定义对应的 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 映射;
- 支持 Jakarta JSON-B 标准的
-
配置项:
- 可注入自定义
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 开发;
- 使用 Gson 将 JSON 解析为
- 优点:
- 小巧,适合移动端;
- 更容易控制输出格式;
- 限制:
- 对于大数据量和复杂类型处理不如 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(...)