❝生命过短暂,不要去作一些根本没有人想要的东西。本文已被 「https://www.yourbatman.cn」 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的「专栏」供以避免费学习。关注公众号【「BAT的乌托邦」】逐个击破,深刻掌握,html
❞
各位小伙伴你们好,我是A哥。上篇文章 【Fastjson到了说再见的时候了】 A哥跟Fastjson说了拜拜,从本系列开始,咱们将一块儿进入Jackson库的学习。固然喽说它是世界上最好的JSON库并不是一家之言,是官网上它本身说的,我免责申明哈。java
Java的JSON库,你「至少」应该用过/听过这三种:Jackson、Gson、Fastjson
。一个独立的工程,按照依赖最少原则,本应该only one JSON库是足矣的。但现状是:各位同仁可观察观察各自的项目,大都同时存在2种JSON库,亦或者3种甚至更多...android
❝说明:在「同一个工程内」,同一功能如有多种实现,实属很差的现象。这会让管理起来显得混乱(譬如对日期的格式化就不方便作到统一),出口如有多个,想收口时就是个大难题了git
❞
做为一个「合格的」架构师/工程师,保持最简依赖(一致性依赖)是应该有的技术范,由于简单一致性它能带来很大的收益,道理很简单:两个Java程序员的沟通/协同效率,必定会比1个Java + 1个Python沟通效率高。程序员
so what,咱们应该选择哪种JSON库呢?答案显而易见,那即是Jackson。由于它各个方面表现均很是优秀,是世界最流行、最好的JSON库。把Jackson
做为工程惟一JSON库是有一丢丢门槛的(想一想你为什么使用Fastjson就知道啦),因此它来啦,祝你跨越此门槛,规范化使用,「助你增长一项主流的硬核实力,这也是本专栏的最大意义所在」。github
Jackson是一个简单的、功能强大的、基于Java的「应用库」。它能够很方便完成「Java对象」和「Json对象」(xml文档or其它格式)进行互转。Jackson社区相对比较活跃,更新速度也比较快。Jackson库有以下几大特性:web
版本约定:本专栏统一使用的版本号固定为2.11.0
(2020-04发布),GAV以下:json
<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也刚好就是本专栏讲解的版本。segmentfault
细心的朋友从上面的groupId
里能够看到:jackson
它隶属于fasterxml
这个组织。本着追本溯源的精神,能够稍微的了解了解这个组织:fasterxml官网 截图以下安全
简单翻译:FasterXML是Woodstox流的XML解析器、Jackson流的JSON解析器、Aalto非阻塞XML解析器以及「不断增加」的实用程序库和扩展家族背后的业务。
做为一个高度流行的开源库,这种官网页面应该刷新了你的认知吧。并非它内容很少,而实际上是它的详细介绍都发布在github
上了,这即是接下来咱们来认识它的主要渠道。
❝这种作法貌似已经成为了一种流行的趋势:愈来愈多的开源软件倾向于把github做为他们的Home Page了
❞
fasterxml
组织它「直属的一级工程」其实也有很多:
很显然,「本专栏仅仅只会关注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等数据格式,甚至还支持大数据格式模块的设置。
Jackson有两个主要的分支:
注意:这两个主要版本使用「不一样的Java包名」和Maven GAV,所以它们并不相互兼容,「但能够和平共存」。一个项目能够同时依赖于这两个版本是没有冲突的。这是通过设计而为之,选择这种策略是为了更顺利地从1.x进行迁移2. x
❝说明:如今都2020年了,1.x能够绝不客气的说已经淘汰了(除了很是老的项目还在用),所以针对1.x版本本专栏不会有任何涉猎。
❞
目前2.x分支存在以下活跃的分支们:
❝说明:对于2.11.0和2.11.x这种小分支之间的区别,能够忽略
❞
Jackson是个开源的、且开放的社区。下面列出的大多数项目/模块是由Jackson开发团队「领导的」,但也有一些来自Jackson社区的成员
「core module(核心模块) 是扩展模块构建的基础」。Jackson目前有3个核心模块:
❝说明:核心模块的groupId均为:
❞<groupId>com.fasterxml.jackson.core</groupId>
,artifactId见下面各模块所示
jackson-core
):定义底层处理流的API:JsonPaser和JsonGenerator等,并包含
「特定于json」的实现。
jackson-annotations
):包含标准的Jackson注解
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>
,且版本号是和主版本号保持一致的
jackson-module-parameter-names
:此模块可以访问构造函数和方法参数的名称,从而容许省略
@JsonProperty
(固然前提是你必须加了编译参数:
-parameters
)
jackson-datatype-jsr310
:支持Java8新增的JSR310时间API
jackson-datatype-jdk8
:除了Java8的时间API外其它的API的支持,如
Optional
「非官方直接维护:」
❝说明:非官方直接维护的这些模块groupId是不定的,每一个模块可能都不同,而且它们的版本号不会随着官方的主版本号一块儿走
❞
javax.money
json-lib
这个库的支持
Data format modules(数据格式模块)提供对「JSON以外」的数据格式的支持。它们中的大多数只是实现streaming API抽象,以便数据绑定组件能够按原样使用。
「官方直接维护:」
❝说明:这些数据格式的模块的groupId均为
❞<groupId>com.fasterxml.jackson.dataformat</groupId>
,且跟着主版本号走
<artifactId>jackson-dataformat-[FORMAT]</artifactId>
「非官方直接维护:」 因非官方直接维护的模块过于偏门,所以省略
官网有说,Jackson是一个「JVM平台」的解析器,所以语言层面不局限于Java自己,还涵盖了另外两大主流JVM语言:Kotlin和Scala
❝说明:这块的groupId均为:
❞<groupId>com.fasterxml.jackson.module</groupId>
,版本号跟着主版本号走
Jackson注解为POJO定义了预期的属性和预期的处理,除了Jackson自己将其用于读取/写入JSON和其余格式以外,它还容许生成「外部模式」。上面已讲述的数据格式扩展中包含了部分功能,但也仍还有许多独立的模式工具,如:
❝说明:本部分因实际应用场景实在太少,为了避免要混淆主要内容,此部分后面亦不会再说起
❞
虽然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漏洞报告
市面上的JSON库很是之多,综合一些Java人员的意见,关于使用哪一个库,这里有一些现有的独立比较的连接供以你参考:
说明:此处贴出的几个参考连接均为官网给出的参考文章,均为国外较权威的文献。
固然天朝的你可能更关心Jackson和Fastjson的对比,那暂先不用着急(虽然上文也比较过),这是本专栏后面的一道主菜,那里会详细道来。
本文结合官网认识了Jackson的全貌,用全面的视角总体上把握到了Jackson所提供的功能模块,这为专栏后续的讲解提供一个索引。
从Jackson的「升级之快、模块支持之多」足矣看得见它社区的活跃。而且为了迎合市场它在2.10
版本后还提供了商业支持的服务:与Tidelift公司合做,为用户构建应用程序的开源依赖项提供商业支持和维护。节省时间、下降风险和改善代码健康情况(商业支持是收费的)。
相信经过本文你对Jackson有了个大概的了解,不出意外你应该是有兴趣去学它了的。当你深刻研究后会发现它的「设计之优雅,扩展性之强」,不是通常国产类库所能比拟的。若是说Fastjson是一个优秀的JSON库,那么Jackson就是一个更优秀的JSON生态。
「本专栏在CSDN付费,在公众号所有免费公开,欢迎你关注A哥的公众号【BAT的乌托邦】」
Author | A哥(YourBatman) |
---|---|
我的站点 | www.yourbatman.cn |
yourbatman@qq.com | |
「微 信」 | fsx641385712 |
「活跃平台 」 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
「公众号」 | BAT的乌托邦(ID:BAT-utopia) |
知识星球 | BAT的乌托邦 |
每日文章推荐 | 每日文章推荐 |