有道无术,术尚可求,有术无道,止于术。
本系列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
之间的转换