20221114 Jackson Json 模块
Jackson 介绍
三大核心模块
Jackson 有三个核心包,分别是 Streaming、Databind、Annotations,通过这些包可以方便的对 JSON 进行操作
-
Streaming 在
jackson-core
模块,定义了一些流处理相关的 API 以及特定的 JSON 实现 -
Annotations 在
jackson-annotations
模块,包含了 Jackson 中的注解 -
Databind 在
jackson-databind
模块, 在 Streaming 包的基础上实现了数据绑定,依赖于 Streaming 和 Annotations 包
从依赖关系看, jackson-databind
依赖于 jackson-core
和 jackson-annotations
,jackson-core
和 jackson-annotations
之间没有依赖关系,且这三者不依赖于其他任何 jar ,这么简单的依赖关系非常少见。
引入Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4</version>
</dependency>
三种 JSON 处理方式
Jackson 提供三种 JSON 处理方式:
-
流式 API :读取并将 JSON 内容写入作为离散事件
JsonParser
读取数据,而JsonGenerator
负责写入数据
-
树模型:JSON 文件在内存里以树形式表示
-
数据绑定:JSON 和 POJO 相互转换,基于属性访问器规约或注解
jackson-core
模块提供了前两种处理 JSON 的方式
jackson-databind
模块提供了第三种处理 JSON 的方式
数据类型模块
这些扩展是 Jackson 插件模块(通过 ObjectMapper.registerModule()
注册,下同),并通过添加序列化器和反序列化器来对各种常用 Java 库数据类型的支持,以便 databind 包(ObjectMapper / ObjectReader / ObjectWriter) 能够顺利读写/转换这些类型。
第三方模块有些是 Jackson 官方人员直接 lead 和维护的(主流模块),也有些是纯社区行为。
官方直接维护
官方维护的这些数据类型模块的 groupId 统一为:com.fasterxml.jackson.datatype
,且版本号是和主版本号保持一致的
常用的:
-
jackson-datatypes-[collections]
-
guava
-
eclipse-collections
-
-
jackson-datatype-joda
-
jackson-datatype-hibernate
示例
以 Guava 集合为例
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.13.4</version>
</dependency>
Multiset<Integer> multiset = HashMultiset.create();
multiset.add(1);
multiset.add(1);
multiset.add(2);
System.out.println(multiset);
String jsonStr = objectMapper.writeValueAsString(multiset);
System.out.println(jsonStr);
// 反序列化时需要,否则会报错
objectMapper.registerModule(new GuavaModule());
Multiset<Integer> multiset1 = objectMapper.readValue(jsonStr, new TypeReference<Multiset<Integer>>() {
});
System.out.println(multiset1);
数据格式模块
Data format modules (数据格式模块) 提供对 JSON之外 的数据格式的支持。它们中的大多数只是实现 streaming API 抽象,以便数据绑定组件可以按原样使用。
官方直接维护
这些数据格式的模块的 groupId 均为 com.fasterxml.jackson.dataformat
,且跟着主版本号走
常用的:
-
jackson-dataformat-xml
-
jackson-dataformat-csv
-
jackson-dataformat-yaml
示例
以 XML 格式为例:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.4</version>
</dependency>
User user = getUser();
ObjectMapper xmlMapper = new XmlMapper();
String xmlStr = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(xmlStr);
/*
<User>
<name>张三</name>
<age>18</age>
<birthDate>949494020000</birthDate>
<likes>
<likes>sing</likes>
<likes>dance</likes>
<likes>read</likes>
</likes>
</User>
*/
源码理解
Jackson 的注释丰富,注释分段比较清晰,分段如下:
/*
/**********************************************************
/* Configuration settings, shared
/**********************************************************
*/