关于jackson:1-初识Jackson-世界上最好的JSON库

51次阅读

共计 6723 个字符,预计需要花费 17 分钟才能阅读完成。

生命太短暂,不要去做一些基本没有人想要的货色。本文已被 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 这种小分支之间的区别,能够疏忽


模块介绍

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
E-mail yourbatman@qq.com
微 信 fsx641385712
沉闷平台
公众号 BAT 的乌托邦(ID:BAT-utopia)
常识星球 BAT 的乌托邦
每日文章举荐 每日文章举荐

正文完
 0