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-corejackson-annotationsjackson-corejackson-annotations 之间没有依赖关系,且这三者不依赖于其他任何 jar ,这么简单的依赖关系非常少见。

引入Maven依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4</version>
</dependency>

三种 JSON 处理方式

Jackson 提供三种 JSON 处理方式:

  1. 流式 API :读取并将 JSON 内容写入作为离散事件

    • JsonParser 读取数据,而 JsonGenerator 负责写入数据
  2. 树模型:JSON 文件在内存里以树形式表示

  3. 数据绑定:JSON 和 POJO 相互转换,基于属性访问器规约或注解

jackson-core 模块提供了前两种处理 JSON 的方式

jackson-databind 模块提供了第三种处理 JSON 的方式

数据类型模块

这些扩展是 Jackson 插件模块(通过 ObjectMapper.registerModule() 注册,下同),并通过添加序列化器和反序列化器来对各种常用 Java 库数据类型的支持,以便 databind 包(ObjectMapper / ObjectReader / ObjectWriter) 能够顺利读写/转换这些类型。

第三方模块有些是 Jackson 官方人员直接 lead 和维护的(主流模块),也有些是纯社区行为。

官方直接维护

GitHub 上搜索

官方维护的这些数据类型模块的 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 抽象,以便数据绑定组件可以按原样使用。

官方直接维护

GitHub 上搜索

这些数据格式的模块的 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
/**********************************************************
 */ 
posted @ 2022-11-21 16:02  流星<。)#)))≦  阅读(95)  评论(0编辑  收藏  举报