模块介绍
Jackson是个开源的、且开放的社区。下面列出的大多数项目/模块是由Jackson开发团队领导的,但也有一些来自Jackson社区的成员
三大核心模块
core module(核心模块) 是扩展模块构建的基础。Jackson目前有3个核心模块:
说明:核心模块的groupId均为:com.fasterxml.jackson.core,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统一为:com.fasterxml.jackson.datatype,且版本号是和主版本号保持一致的
- 标准集合数据类型模块:
- 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均为com.fasterxml.jackson.dataformat,且跟着主版本号走
- Avro/CBOR/Ion/Protobuf/Smile(binary JSON) :这些均属于二进制的数据格式,它们的artifactId为:jackson-dataformat-[FORMAT]
- CSV/Properties/XML/YAML:这些格式熟悉吧,同样的支持到了这些常用的文本格式
非官方直接维护:
因非官方直接维护的模块过于偏门,因此省略
JVM平台其它语言
官网有说,Jackson是一个JVM平台的解析器,因此语言层面不局限于Java本身,还涵盖了另外两大主流JVM语言:Kotlin和Scala
说明:这块的groupId均为:com.fasterxml.jackson.module,版本号跟着主版本号走
- 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生态。