有道无术,术尚可求,有术无道,止于术。
本系列Jackson 版本 2.17.0
源码地址:https://gitee.com/pearl-organization/study-seata-demo
文章目录
- 1. 前言
- 2. 什么是 JSON
- 3. 常用 Java JSON 库
- 4. Jackson
- 4.1 简介
- 4.2 套件
- 4.3 模块
- 4.3.1 核心模块
- 4.3.2 数据类型模块
- 4.3.3 Jackson JAX-RS
- 4.3.4 数据格式模块
- 4.3.5 JVM 模块
- 4.3.6 其他模块
- 4.3.7 Jackson jr
 
- 4.4 模式支持
- 4.5 处理方式
 
 
1. 前言
本篇文档重点笔记:😀😀😀记住Jackson 包含的三大核心模块😀😀😀
对于Java编程人员来说,相信大家对JSON已经很熟悉了,或多或少都用过Fastjson、Jackson等JSON处理工具。
大多数开发场景下,涉及到JSON时,大部分成熟的框架已经帮我们封装好了,比如Spring MVC、Spring Boot,除了需要在业务代码中调用简单API进行JSON转换外,其他时候并不太涉及。所以这也导致了我们对JSON工具的高级用法、执行原理并不太熟悉。所以有必要深入了解一下相关Json工具,以便于我们在性能优化、高级扩展时能够从容应对。
本系列学习的对象是Jackson,从基础入门到深入剖析,相信通过本栏的学习,能够帮助大家在技术方面更上一层楼。
2. 什么是 JSON
JSON的全称是JavaScript Object Notation(JS对象图谱),来源于JavaScript中的对象表示法,是一种轻量级的数据交换格式。
XML作为可扩展标记语言,用于存储和传输数据,于1998年由W3C发布XML 1.0标准,并在之后陆续发布了其他版本。在编程中,XML常用于配置文件、数据交换,但是其存在语法复杂、冗余、文件体积较大等缺点。
2001年,JSON 之父Douglas Crockford基于JavaScript对象字面量语法,提出了JSON数据交换格式,因其易于阅读编写、易于机器解析生成、轻量级等特点,目前已成为Web领域数据交换格式的应用标准。
JSON其实也就是字符串, 只不过元素会使用特定的符号标注。比如:
{"a": 1, "b": [1, 2, 3]}
在上述示例中:
- {}双括号表示对象
- []中括号表示数组
- ""双引号内是属性或值
- :冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
3. 常用 Java JSON 库
在JSON 官网中,可以看到几乎所有的编程语言都提供了对JSON的支持,基于Java的 JSON库也有很多种:
 
 国内最常用的Java JSON 库有以下几种:
- Gson:由- Google公司开源维护
- Fastjson:- Java编写的高性能的- JSON库,由阿里巴巴公司开发,号称其独创的算法解析速度超过所有- JSON库
- Jackson: 基于- Java处理- JSON格式数据的一套类库(也支持其他格式)
4. Jackson
4.1 简介
GitHub地址
 官方文档地址
Jackson 是一个由FasterXML组织开源维护的一个基于Java 的JSON库。
Jackson具有轻量级、高性能、易用性、无其他依赖(仅依赖JDK)等特点,已经成为了很多JAVA框架的默认JSON库,目前应该算是最受欢迎的JSON 工具。
Jackson包含了两个主要版本,1.x已经停止维护,2.x是当前积极开发的版本,最新稳定版本是于2024年03月14日发布的2.17.0。
4.2 套件
Jackson提供了一套适用于Java的数据处理工具,包括:
- JSON解析- &- JSON生成库
- 数据绑定库,处理POJO和JSON之间的互相转换
- 其他数据格式库,用于处理Avro、BSON、CBOR、CSV、Smile、Java Properties、Protobuf、TOML、XML或YAML中编码的数据
- 大数据集格式库,如Guava、Joda、PCollections等
4.3 模块
Jackson包含了很多模块,大部分都是由Jackson团队开发维护,也有一些是由社区成员提供。
4.3.1 核心模块
Jackson核心模块是其他扩展模块构建的基础,包含以下三个核心模块:
- jackson-core:核心底层模块,定义了一些底层的流处理- API和公共抽象类
- jackson-annotations:标准注解模块,定义了标准的用于数据处理的相关注解
- jackson-databind:数据绑定模块,依赖于上面两个模块,定义了用于数据绑定的高层- API

4.3.2 数据类型模块
数据类型模块在ObjectMapper.registerModule()中进行注册,并通过添加序列化和反序列化功能对各种常用Java数据类型进行支持,然后使用Jackson数据绑定包中的ObjectMapper/ObjectReader/ObjectWriter可以读写这些类型。
Jackson核心团队直接维护的数据类型模块:
- 标准集合数据类型模块: 
  - jackson-datatype-eclipse-collections:支持- Eclipse集合(- 2.10版本)
- jackson-datatype-guava:支持- guava数据类型
- jackson-datatype-hppc:支持- High-Performance Primitive Containers
- jackson-datatype-pcollections:支持- PCollections数据类型(- 2.7版本)
 
- Hibernate:支持- Hibernate功能(延迟加载、代理)
- Java 8模块:通过- 3个独立的模块支持- JDK 8功能和数据类型- jackson-module-parameter-names:增加了对使用新的- JDK8功能的支持,能够访问构造函数和方法参数的名称,从而允许省略- @JsonProperty
- jackson-datatype-jsr310:支持- JDK8新增的- JSR310时间- API
- jackson-datatype-jdk8:支持除日期/时间类型之外的- JDK 8数据类型,包括- Optional
 
- Joda数据类型:- jackson-datatype-joda:支持- Joda-Time日期/时间库数据类型的类型
- jackson-datatype-joda-money:支持- Joda-Money数据类型,例如- Money、- CurrencyUnit
 
- JSON-P(- json processing):- jackson-datatype-jakarta-jsonp:支持- jakarta.json中新的- JSON-P类型(- 2.12.2版本)
- jackson-datatype-jsr353:支持- jakarta.json中旧的- JSON-P类型
 
- jackson-datatype-json-org:支持- org.json库中的类型,如- JSONObject、- JSONArray
Jackson核心团队没有直接维护的其他模块:
- jackson-datatype-bolts:支持- Yandex-bolts集合类型定义的读/写类型(受函数编程启发的不可变集合)
- jackson-datatype-commons-lang3:用于- Apache commons Lang v3的类型
- jackson-datatype-money:支持- Java money
- vavr-jackson:支持- VAVR(- Java™8及以上版本的功能丰富且独立的功能编程)
- jackson-datatype-json-lib:支持- son-lib定义的类型
- jackson-datatype-jts:支持- GeoJSON中的- JTS Geometry
- jackson-lombok:支持- lombok
- jackson-datatype-mongo:支持- MongoDB类型(已有替代方案)
- jackson-module-objectify:支持- Objectify数据类型
- jackson-datatype-protobuf:支持由- HubSpot开发的标准- Java protobuf库定义的数据类型
- tinytypes-jackson:- TinyTypes集成的- Jackson
- jackson-datatype-vertx:支持- Vert.x中用于用于读/写的- JsonObject对象
4.3.3 Jackson JAX-RS
Jackson JAX-RS添加了对JAX-RS实现(如Jersey、RESTeasy、CXF)的数据格式支持,提供实现MessageBodyReader和MessageBodyWriter,目前支持的格式包括JSON、Smile、XML、YAML和CBOR。
4.3.4 数据格式模块
数据格式模块支持JSON以外的数据格式,它们中的大多数只是实现流式API抽象,这样数据绑定组件就可以按原样使用,有些提供额外的数据绑定级别功能来处理模式之类的事情。
目前,以下数据格式模块是完全可用和受支持的:
- Avro:支持- Avro数据格式,具有流式实现以及对- Avro架构的额外数据绑定级别支持
- CBOR:支持- CBOR数据格式(二进制- JSON变体)
- CSV:支持逗号分隔的值格式
- Ion:支持- Amazon Ion二进制数据格式(类似- CBOR、- Smile,即二进制- JSON)
- Java Properties:使用隐含表示法创建嵌套结构(默认为点式,可配置),在序列化时类似地进行扁平化
- Protobuf:支持类似- Avro
- Smile:支持- Smile(二进制- JSON),- 100%的- API/- logical模型通过流式- API兼容,不更改数据绑定
- TOML:支持- TOML,同时支持流媒体和数据绑定实现
- XML:支持- XML,提供流和数据绑定实现,类似于- JAXB的“代码优先”模式(不支持- XML“模式优先”,但可以使用- JAXB- bean)
- YAML:支持- YAML,与- JSON类似,完全支持简单的流式实现
还有其他数据格式模块,由Jackson核心团队以外的开发人员提供:
- BEncode:支持读取/写入- BEncode(- BitTorrent格式)编码数据
- bson4jackson:增加了对- BSON数据格式的支持
- EXIficient:- EXIficient中支持高效的- XML交换
- jackson-dataformat-msgpack:支持- MessagePack格式
- HOCON:支持- HOCON格式
- Rison::支持- Rison
4.3.5 JVM 模块
除了 Java还支持基于JVM的其他语言:
- Kotlin:处理原生类型的- Kotlin
- Scala:处理原生- Scala类型,目前- Scala 2.9支持到- Jackson 2.3,- Scala 2.10支持到- Jackson 2.11
4.3.6 其他模块
FasterXML团队的其他完全可用的模块包括:
- Afterburner:使用字节码生成将数据绑定速度提高- 30-40%,以取代对字段访问、方法/构造函数调用使用反射
- Guice:允许来自- Guice注入器(和基础的- Guice注解)的注入值的扩展,而不是标准的- @JacksonInject
- JAXB Annotations:允许使用- JAXB注解作为标准- Jackson注解的替代
- Mr Bean:- type materialization支持(动态生成实现类,不生成源代码)
- OSGi:允许通过标准的- @JacksonInject注解从- OSGi注册表注入值
- Paranamer:用于自动计算创建者(构造函数、工厂方法)参数名称的微小扩展,以避免必须指定- @JsonProperty
4.3.7 Jackson jr
Jackson jr建立在Jackson Streaming API上,但不依赖于数据绑定。因此,它的大小(jar和运行时内存使用量)要小得多,其API非常紧凑,常应用于移动端。
4.4 模式支持
Jackson除了使用编码的方式来读取/写入 JSON和其他格式数据外,还支持外部模式生成。其中一些功能包含在上述数据格式扩展中,但是也有许多独立的Schema工具,例如:
- jackson-jsonschema-ant-task
- jsonschema-generator
- mbknor-jackson-jsonSchema
- jackson-module-jsonSchema
- …
4.5 处理方式
Jackson提供了三种处理JSON的方式:
- Streaming API:流式- API,将- JSON内容作为离散事件读取和写入,使用- JsonParser、- JsonGenerator进行读写操作,开销最小,效率最高
- Tree Model:树模型,类似于- XML的- DOM解析器,将- JSON内容使用树状结构表示,比较灵活
- Data Binding:数据绑定,简单易用- Simple Data Binding:简单的数据类型绑定,- Java基本数据类型、集合和- JSON之间的转换
- Full Data Binding:完整的数据类型绑定,- Java Bean和- JSON之间的转换
 











![[Linux]多线程(在Linux中的轻量级进程(LWP),怎么使用线程(接口))](https://img-blog.csdnimg.cn/direct/e20da0d5ac5c414d924eaae445536b79.png)







