生命太短暂,不要去做一些基本没有人想要的货色。本文已被 https://www.yourbatman.cn 收录,外面一并有 Spring 技术栈、MyBatis、JVM、中间件等小而美的 专栏 供以收费学习。关注公众号【BAT 的乌托邦】一一击破,深刻把握,回绝浅尝辄止。
前言
各位小伙伴大家好,我是 A 哥。上篇文章【Fastjson 到了说再见的时候了】A 哥跟 Fastjson 说了拜拜,从本系列开始,咱们将一起进入 Jackson 库的学习。当然喽说它是世界上最好的 JSON 库并非一家之言,是官网上它本人说的,我免责申明哈。
一个工程仅需一个 JSON 库
Java 的 JSON 库,你 至多 应该用过 / 听过这三种:Jackson、Gson、Fastjson
。一个独立的工程,依照依赖起码准则,本应该 only one JSON 库是足矣的。但现状是:各位同仁可察看察看各自的我的项目,大都同时存在 2 种 JSON 库,亦或者 3 种甚至更多 …
阐明:在 同一个工程内,同一性能若有多种实现,实属不好的景象。这会让治理起来显得凌乱(譬如对日期的格式化就不不便做到对立),进口若有多个,想收口时就是个大难题了
作为一个 合格的 架构师 / 工程师,放弃最简依赖 (一致性依赖) 是应该有的技术范,因为简略一致性它能带来很大的收益,情理很简略:两个 Java 程序员的沟通 / 协同效率,肯定会比 1 个 Java + 1 个 Python 沟通效率高。
so what,咱们应该抉择哪一种 JSON 库呢?答案不言而喻,那便是 Jackson。因为它各个方面体现均十分优良,是世界最风行、最好的 JSON 库。把 Jackson
作为工程惟一 JSON 库是有一丢丢门槛的(想想你为何应用 Fastjson 就晓得啦),所以它来啦,祝你逾越此门槛,规范化应用,助你减少一项支流的硬核实力,这也是本专栏的最大意义所在。
Jackson 是世界最好的 JSON 库
Jackson 是一个简略的、功能强大的、基于 Java 的 利用库 。它能够很不便实现Java 对象 和Json 对象(xml 文档 or 其它格局)进行互转。Jackson 社区绝对比拟沉闷,更新速度也比拟快。Jackson 库有如下几大个性:
- 高性能且稳固:低内存占用,对大 / 小 JSON 串,大 / 小对象的解析体现均很优良
- 风行度高:是很多风行框架的默认抉择
- 容易应用:提供高层次的 API,极大简化了日常应用案例
- 无需本人手动创立映射:内置了绝大部分序列化时和 Java 类型的映射关系
- 洁净的 JSON:创立的 JSON 具备洁净、紧凑、体积小等特点
- 无三方依赖:仅依赖于 JDK
- Spring 生态加持:jackson 是 Spring 家族的默认 JSON/XML 解析器(明确了吧,学完此专栏你对 Spring 都能更亲热些了,两全其美)
版本约定:本专栏对立应用的版本号固定为2.11.0
(2020-04 公布),GAV 如下:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.1</version>
</dependency>
为了放弃版本的统一性,后续的 Spring Boot(2.3.0.RELEASE)/Spring Framework(5.2.6.RELEASE)
应用的均为以后最新版本,因为它内置的 jackson 也恰好就是本专栏解说的版本。
注释
仔细的敌人从下面的 groupId
里能够看到:jackson
它隶属于 fasterxml
这个组织。本着寻根究底的精力,能够略微的理解理解这个组织:fasterxml 官网 截图如下
简略翻译:FasterXML 是 Woodstox 流的 XML 解析器、Jackson 流的 JSON 解析器、Aalto 非阻塞 XML 解析器以及 一直增长 的实用程序库和扩大家族背地的业务。
作为一个高度风行的开源库,这种官网页面应该刷新了你的认知吧。并不是它内容不多,而其实是它的具体介绍都公布在 github
上了,这便是接下来咱们来意识它的次要渠道。
这种做法貌似曾经成为了一种风行的趋势:越来越多的开源软件偏向于把 github 作为他们的 Home Page 了
fasterxml
组织它 直属的一级工程 其实也有不少:
- com.fasterxml.jackson
- com.fasterxml.uuid
- com.fasterxml.woodstox
- …
很显然,本专栏仅仅只会关注 jackson 工程,该工程便是该组织最闻名且最最最为重要的局部。
官网介绍
理解一门新的技术,第一步应该就是看它的官网。下面未然解释了,fasterxml
组织它把各工程的首页内容都托管在了 github 上,Jackson 当然也不例外。Jackson 官网 上对它本人有如下形容:
Jackson 旧称为:Java(或 JVM 平台)的规范 JSON 库,或者是 Java 的 最佳 JSON 解析器,或者简称为“Java 的 JSON”
从这名字就霸气外露了,NB 得不行,足以见得它在 JSON 解析方面的位置和风行水平,当然次要是自信
更重要的是,Jackson 是一套 JVM 平台的 数据处理(不限于 JSON) 工具集:包含 一流的 JSON 解析器 / JSON 生成器、数据绑定库(POJOs to and from JSON);并且提供了相干模块来反对 Avro, BSON, CBOR, CSV, Smile, Properties, Protobuf, XML or YAML 等数据格式,甚至还反对大数据格式模块的设置。
分支:1.x 和 2.x
Jackson 有两个次要的分支:
- 1.x 分支,1.9.13。处于保护模式,只公布 bug 修复版本(最近一次公布于 Jul, 2013)
- 2.x 是正在开发的版本(继续更新降级中,2.0.0 公布于 Mar, 2012)
留神:这两个次要版本应用 不同的 Java 包名 和 Maven GAV,因而它们并不互相兼容,但能够和平共存。一个我的项目能够同时依赖于这两个版本是没有抵触的。这是通过设计而为之,抉择这种策略是为了更顺利地从 1.x 进行迁徙 2. x
阐明:当初都 2020 年了,1.x 能够毫不客气的说曾经淘汰了(除了十分老的我的项目还在用),因而针对 1.x 版本本专栏不会有任何涉猎。
沉闷的 2.x 分支阐明
目前 2.x 分支存在如下沉闷的分支们:
- 2.12:下一个小版本,目前正在开发中
- 2.11:以后稳定版。踊跃保护的分支,会踊跃继续公布补丁
- 2.10:上一个稳固的分支,没有进行保护仍会公布补丁
- 2.9: 非沉闷分支,只会公布微补丁了,尽管还沉闷但活跃度较低
- 其它 2.x 分支:只会公布重大安全补丁
- master:主分支。下一个次要分支 3.0 正在疾速开发中
阐明:对于 2.11.0 和 2.11.x 这种小分支之间的区别,能够疏忽
模块介绍
Jackson 是个开源的、且凋谢的社区。上面列出的大多数我的项目 / 模块是由 Jackson 开发团队 领导的,但也有一些来自 Jackson 社区的成员
三大外围模块
core module(外围模块) 是扩大模块构建的根底。Jackson 目前有 3 个外围模块:
阐明:外围模块的 groupId 均为:
<groupId>com.fasterxml.jackson.core</groupId>
,artifactId 见上面各模块所示
- Streaming 流解决模块 (
jackson-core
):定义底层解决流的 API:JsonPaser 和 JsonGenerator 等,并蕴含 特定于 json的实现。 - Annotations 规范注解模块(
jackson-annotations
):蕴含规范的 Jackson 注解 - Databind 数据绑定模块 (
jackson-databind
):在 streaming 包上实现数据绑定(和对象序列化) 反对;它依赖于下面的两个模块 ,也是 Jackson 的高层 API(如 ObjectMapper) 所在的模块
理论利用级开发中,咱们只会应用到 Databind 数据绑定模块,so 它是本系列重中之重。上面介绍那些无足轻重的 第三方模块。
数据类型模块
这些扩大是 Jackson 插件模块 (通过ObjectMapper.registerModule()
注册,下同),并通过增加序列化器和反序列化器来对各种罕用 Java 库数据类型的反对,以便 Jackson databind
包(ObjectMapper / ObjectReader / ObjectWriter
)可能顺利读写 / 转换这些类型。
第三方模块有些是 Jackson 官网人员间接 lead 和保护的(支流模块),也有些是纯社区行为。当初依照这两个分类别离介绍一下各个模块的作用:
官网间接保护:
阐明:官网保护的这些数据类型模块的 groupId 对立为:
<groupId>com.fasterxml.jackson.datatype</groupId>
,且版本号是和主版本号保持一致的
-
规范汇合数据类型模块:
- Guava:反对 Guava 的汇合数据类型
- HPPC:略
- PCollections:略 (Jackson 2.7 新增的反对)
- Hibernate:反对 Hibernate 的一些个性,如懒加载、proxy 代理等
- Joda:反对 Joda date/time 的数据类型
- JDK7:对 JDK7 的反对(阐明:2.7 当前就无用了,认为 2.7 版本后最低的 JDK 版本要求是 7)
-
Java8:它分为如下三个子模块来反对 Java8
-
jackson-module-parameter-names
:此模块可能拜访构造函数和办法参数的名称,从而容许省略@JsonProperty
(当然前提是你必须加了编译参数:-parameters
) -
jackson-datatype-jsr310
:反对 Java8 新增的 JSR310 工夫 API -
jackson-datatype-jdk8
:除了 Java8 的工夫 API 外其它的 API 的反对,如Optional
-
- JSR-353/org.json:略
非官方间接保护:
阐明:非官方间接保护的这些模块 groupId 是不定的,每个模块可能都不一样,并且它们的版本号不会随着官网的主版本号一起走
- jackson-datatype-bolts:对 Yandex Bolts collection types 的反对
- jackson-datatype-commons-lang3:反对 Apache Commons Lang v3 外面的一些类型
- jackson-datatype-money:反对
javax.money
- jackson-datatype-json-lib:对长远的
json-lib
这个库的反对 - …
数据格式模块
Data format modules(数据格式模块)提供对 JSON 之外 的数据格式的反对。它们中的大多数只是实现 streaming API 形象,以便数据绑定组件能够按原样应用。
官网间接保护:
阐明:这些数据格式的模块的 groupId 均为
<groupId>com.fasterxml.jackson.dataformat</groupId>
,且跟着主版本号走
- Avro/CBOR/Ion/Protobuf/Smile(binary JSON):这些均属于二进制的数据格式,它们的 artifactId 为:
<artifactId>jackson-dataformat-[FORMAT]</artifactId>
- CSV/Properties/XML/YAML:这些格局相熟吧,同样的反对到了这些罕用的文本格式
非官方间接保护:
因非官方间接保护的模块过于偏门,因而省略
JVM 平台其它语言
官网有说,Jackson 是一个 JVM 平台 的解析器,因而语言层面不局限于 Java 自身,还涵盖了另外两大支流 JVM 语言:Kotlin 和 Scala
阐明:这块的 groupId 均为:
<groupId>com.fasterxml.jackson.module</groupId>
,版本号跟着主版本号走
- jackson-module-kotlin:解决 kotlin 源生类型
- jackson-module-scala_[scala 版本号]:解决 scala 源生类型
模式反对
Jackson 注解为 POJO 定义了预期的属性和预期的解决,除了 Jackson 自身将其用于读取 / 写入 JSON 和其余格局之外,它还容许生成 内部模式。下面已讲述的数据格式扩大中蕴含了局部性能,但也仍还有许多独立的模式工具,如:
- Ant Task for JSON Schema Generation:应用 Apache Ant 时,应用 Jackson 库和扩大模块从 Java 类生成 JSON
- jackson-json-schema-maven-plugin:maven 插件,用于生成 JSON
- …
阐明:本局部因理论利用场景切实太少,为了不要混同次要内容,此局部前面亦不会再提及
Jackson jr(用于挪动端)
尽管 Jackson databind
(如 ObjectMapper)是通用数据绑定的良好抉择,但它的 占用空间(Jar 包大小)和 启动开销 在某些畛域可能存在问题:比方挪动端,特地是对于轻量应用(读或写)。这种 case 下,残缺的 Jackson API 是让人承受不了的。
因为所有这些起因,Jackson 官网决定创立一个 更简略、更小 的库:Jackson jr。它仍旧构建在 Streaming API 之上,但不依赖于 databind 和 annotation。因而,它的大小 (jar 和运行时内存应用) 要小得多,它的 API 十分紧凑,所以适宜 APP 等挪动端。
<dependency>
<groupId>com.fasterxml.jackson.jr</groupId>
<artifactId>jackson-jr-objects</artifactId>
</dependency>
它仅仅只依赖了 jackson-core
模块,所以体积上管制得十分的好。Jackson 单单三大外围模块大小共计 1700KB 左右(320 + 70 + 1370)。而 Jackson jr 的体积管制在了 95KB(就算加上 core 模块的 320 也不到 500KB)。
而对于开发 Java 后盾的咱们对内存并不敏感,简略易用、功能强大才是硬道理。因而 jackson-jr
只是在此处做个简略理解即可,本专栏前面也不会再提及。
破绽报告
Jackson 尽管曾经足够稳固并且平安了,但哪有圣人呢。针对它的相干破绽报告,最近一次产生在 2019-07-23
:FasterXML jackson-databind 近程代码执行(CVE-2019-12384)
更多、更新的具体破绽报告参考链接(继续更新中):晓得创宇 Jackson 破绽报告
Java JSON 库比拟
市面上的 JSON 库十分之多,综合一些 Java 人员的意见,对于应用哪个库,这里有一些现有的独立比拟的链接供以你参考:
- Top 7 Open-Source JSON-binding providers
- Be a Lazy but a Productive Android Developer, Part 3: JSON Parsing Library
- “Can anyone recommend a good Java JSON library” (Linked-In group)
- “Which JSON library to use on Android?”
阐明:此处贴出的几个参考链接均为官网给出的参考文章,均为国外较权威的文献。
当然天朝的你可能更关怀 Jackson 和 Fastjson 的比照,那暂先不必焦急(尽管上文也比拟过),这是本专栏前面的一道主菜,那里会具体道来。
总结
本文联合官网意识了 Jackson 的全貌,用全面的视角整体上把握到了 Jackson 所提供的功能模块,这为专栏后续的解说提供一个索引。
从 Jackson 的 降级之快、模块反对之多 足矣看得见它社区的沉闷。并且为了投合市场它在 2.10
版本后还提供了商业反对的服务:与 Tidelift 公司单干,为用户构建应用程序的开源依赖项提供商业反对和保护。节省时间、升高危险和改善代码健康状况(商业反对是免费的)。
置信通过本文你对 Jackson 有了个大略的理解,不出意外你应该是有趣味去学它了的。当你深入研究后会发现它的 设计之优雅,扩展性之强,不是个别国产类库所能比较的。如果说 Fastjson 是一个优良的 JSON 库,那么 Jackson 就是一个更优良的 JSON 生态。
本专栏在 CSDN 付费,在公众号全副收费公开,欢送你关注 A 哥的公众号【BAT 的乌托邦】
关注 A 哥
Author | A 哥(YourBatman) |
---|---|
集体站点 | www.yourbatman.cn |
yourbatman@qq.com | |
微 信 | fsx641385712 |
沉闷平台 |
|
公众号 | BAT 的乌托邦(ID:BAT-utopia) |
常识星球 | BAT 的乌托邦 |
每日文章举荐 | 每日文章举荐 |