1. 初识Jackson — 世界上最好的JSON库

生命太短暂,不要去做一些基本没有人想要的器械。本文已被 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

很显然,本专栏仅仅只会关注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这种小分支之间的区别,可以忽略

LeetCode 86 | 链表基础,一次遍历处理链表中所有符合条件的元素

模块先容

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-23FasterXML jackson-databind 远程代码执行(CVE-2019-12384)
更多、更新的详细破绽讲述参考链接(连续更新中):知道创宇Jackson破绽讲述

Java JSON库对照

市面上的JSON库异常之多,综合一些Java职员的意见,关于使用哪个库,这里有一些现有的自力对照的链接供以你参考:

说明:此处贴出的几个参考链接均为官网给出的参考文章,均为外洋较权威的文献。

固然天朝的你可能更体贴Jackson和Fastjson的对比,那暂先不用着急(虽然上文也对照过),这是本专栏后面的一道主菜,那里会详细道来。

总结

本文连系官网熟悉了Jackson的全貌,用周全的视角整体上掌握到了Jackson所提供的功效模块,这为专栏后续的解说提供一个索引。

从Jackson的升级之快、模块支持之多足矣看得见它社区的活跃。而且为了迎合市场它在2.10版本后还提供了商业支持的服务:与Tidelift公司互助,为用户构建应用程序的开源依赖项提供商业支持和维护。节省时间、降低风险和改善代码健康状况(商业支持是收费的)。

信赖通过本文你对Jackson有了个也许的领会,不出意外你应该是有兴趣去学它了的。当你深入研究后会发现它的设计之优雅,扩展性之强,不是一样平常国产类库所能对比的。如果说Fastjson是一个优异的JSON库,那么Jackson就是一个更优异的JSON生态。

本专栏在CSDN付费,在民众号所有免费公然,迎接你关注A哥的民众号【BAT的乌托邦】

原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/24332.html