生命太短暂,不要去做一些基本没有人想要的货色。本文已被 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组织它直属的一级工程其实也有不少:

  1. com.fasterxml.jackson
  2. com.fasterxml.uuid
  3. com.fasterxml.woodstox
  4. ...

很显然,本专栏仅仅只会关注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哥

AuthorA哥(YourBatman)
集体站点www.yourbatman.cn
E-mailyourbatman@qq.com
微 信fsx641385712
沉闷平台
公众号BAT的乌托邦(ID:BAT-utopia)
常识星球BAT的乌托邦
每日文章举荐每日文章举荐