济源网站开发,重庆施工员证查询网站,开办时 网站建设费 科目,建站神器有道无术#xff0c;术尚可求#xff0c;有术无道#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 什么是 JSON3. 常用 Java JSON 库4. Jackson4.1 简介4.2 套件4.3 模块4.… 有道无术术尚可求有术无道止于术。 本系列Jackson 版本 2.17.0 源码地址https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 什么是 JSON3. 常用 Java JSON 库4. Jackson4.1 简介4.2 套件4.3 模块4.3.1 核心模块4.3.2 数据类型模块4.3.3 Jackson JAX-RS4.3.4 数据格式模块4.3.5 JVM 模块4.3.6 其他模块4.3.7 Jackson jr 4.4 模式支持4.5 处理方式 1. 前言
本篇文档重点笔记记住Jackson 包含的三大核心模块
对于Java编程人员来说相信大家对JSON已经很熟悉了或多或少都用过Fastjson、Jackson等JSON处理工具。
大多数开发场景下涉及到JSON时大部分成熟的框架已经帮我们封装好了比如Spring MVC、Spring Boot除了需要在业务代码中调用简单API进行JSON转换外其他时候并不太涉及。所以这也导致了我们对JSON工具的高级用法、执行原理并不太熟悉。所以有必要深入了解一下相关Json工具以便于我们在性能优化、高级扩展时能够从容应对。
本系列学习的对象是Jackson从基础入门到深入剖析相信通过本栏的学习能够帮助大家在技术方面更上一层楼。
2. 什么是 JSON
JSON的全称是JavaScript Object NotationJS对象图谱来源于JavaScript中的对象表示法是一种轻量级的数据交换格式。
XML作为可扩展标记语言用于存储和传输数据于1998年由W3C发布XML 1.0标准并在之后陆续发布了其他版本。在编程中XML常用于配置文件、数据交换但是其存在语法复杂、冗余、文件体积较大等缺点。
2001年JSON 之父Douglas Crockford基于JavaScript对象字面量语法提出了JSON数据交换格式因其易于阅读编写、易于机器解析生成、轻量级等特点目前已成为Web领域数据交换格式的应用标准。
JSON其实也就是字符串 只不过元素会使用特定的符号标注。比如
{a: 1, b: [1, 2, 3]}在上述示例中
{} 双括号表示对象[] 中括号表示数组双引号内是属性或值: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
3. 常用 Java JSON 库
在JSON 官网中可以看到几乎所有的编程语言都提供了对JSON的支持基于Java的 JSON库也有很多种 国内最常用的Java JSON 库有以下几种
Gson由Google公司开源维护FastjsonJava编写的高性能的JSON库由阿里巴巴公司开发号称其独创的算法解析速度超过所有JSON库Jackson 基于Java 处理 JSON 格式数据的一套类库也支持其他格式
4. Jackson
4.1 简介
GitHub地址 官方文档地址
Jackson 是一个由FasterXML组织开源维护的一个基于Java 的JSON库。
Jackson具有轻量级、高性能、易用性、无其他依赖仅依赖JDK等特点已经成为了很多JAVA框架的默认JSON库目前应该算是最受欢迎的JSON 工具。
Jackson包含了两个主要版本1.x已经停止维护2.x是当前积极开发的版本最新稳定版本是于2024年03月14日发布的2.17.0。
4.2 套件
Jackson提供了一套适用于Java的数据处理工具包括
JSON解析 JSON生成库数据绑定库处理POJO和JSON之间的互相转换其他数据格式库用于处理Avro、BSON、CBOR、CSV、Smile、Java Properties、Protobuf、TOML、XML或YAML中编码的数据大数据集格式库如Guava、Joda、PCollections等
4.3 模块
Jackson包含了很多模块大部分都是由Jackson团队开发维护也有一些是由社区成员提供。
4.3.1 核心模块
Jackson核心模块是其他扩展模块构建的基础包含以下三个核心模块
jackson-core核心底层模块定义了一些底层的流处理API和公共抽象类jackson-annotations标准注解模块定义了标准的用于数据处理的相关注解jackson-databind数据绑定模块依赖于上面两个模块定义了用于数据绑定的高层API 4.3.2 数据类型模块
数据类型模块在ObjectMapper.registerModule()中进行注册并通过添加序列化和反序列化功能对各种常用Java数据类型进行支持然后使用Jackson数据绑定包中的ObjectMapper/ObjectReader/ObjectWriter可以读写这些类型。
Jackson核心团队直接维护的数据类型模块
标准集合数据类型模块 jackson-datatype-eclipse-collections支持Eclipse集合2.10版本jackson-datatype-guava支持guava数据类型jackson-datatype-hppc支持High-Performance Primitive Containers jackson-datatype-pcollections支持PCollections数据类型2.7版本 Hibernate支持Hibernate功能延迟加载、代理Java 8模块通过3个独立的模块支持JDK 8功能和数据类型 jackson-module-parameter-names增加了对使用新的JDK8功能的支持能够访问构造函数和方法参数的名称从而允许省略JsonPropertyjackson-datatype-jsr310支持JDK8新增的JSR310时间APIjackson-datatype-jdk8支持除日期/时间类型之外的JDK 8数据类型包括Optional Joda数据类型 jackson-datatype-joda支持 Joda-Time日期/时间库数据类型的类型jackson-datatype-joda-money支持 Joda-Money数据类型例如Money、CurrencyUnit JSON-Pjson processing jackson-datatype-jakarta-jsonp支持jakarta.json中新的JSON-P类型2.12.2版本jackson-datatype-jsr353支持jakarta.json中旧的JSON-P类型 jackson-datatype-json-org支持org.json库中的类型如JSONObject、JSONArray
Jackson核心团队没有直接维护的其他模块
jackson-datatype-bolts支持Yandex-bolts集合类型定义的读/写类型受函数编程启发的不可变集合jackson-datatype-commons-lang3用于Apache commons Lang v3的类型jackson-datatype-money支持Java moneyvavr-jackson支持VAVR Java™8及以上版本的功能丰富且独立的功能编程jackson-datatype-json-lib支持son-lib定义的类型jackson-datatype-jts支持GeoJSON 中的JTS Geometryjackson-lombok支持lombokjackson-datatype-mongo支持MongoDB 类型已有替代方案jackson-module-objectify支持Objectify数据类型jackson-datatype-protobuf支持由HubSpot开发的标准Java protobuf库定义的数据类型tinytypes-jacksonTinyTypes集成的Jacksonjackson-datatype-vertx支持Vert.x中用于用于读/写的JsonObject 对象
4.3.3 Jackson JAX-RS
Jackson JAX-RS添加了对JAX-RS实现如Jersey、RESTeasy、CXF的数据格式支持提供实现MessageBodyReader和MessageBodyWriter目前支持的格式包括JSON、Smile、XML、YAML和CBOR。
4.3.4 数据格式模块
数据格式模块支持JSON以外的数据格式它们中的大多数只是实现流式API抽象这样数据绑定组件就可以按原样使用有些提供额外的数据绑定级别功能来处理模式之类的事情。
目前以下数据格式模块是完全可用和受支持的
Avro支持Avro数据格式具有流式实现以及对Avro架构的额外数据绑定级别支持CBOR支持CBOR数据格式二进制JSON变体CSV支持逗号分隔的值格式Ion支持Amazon Ion二进制数据格式类似CBOR、Smile即二进制JSONJava Properties 使用隐含表示法创建嵌套结构默认为点式可配置在序列化时类似地进行扁平化Protobuf 支持类似AvroSmile支持Smile二进制JSON100%的API/logical模型通过流式API兼容不更改数据绑定TOML支持TOML同时支持流媒体和数据绑定实现XML支持XML提供流和数据绑定实现类似于JAXB的“代码优先”模式不支持XML“模式优先”但可以使用JAXB beanYAML支持YAML与JSON类似完全支持简单的流式实现
还有其他数据格式模块由Jackson核心团队以外的开发人员提供
BEncode支持读取/写入 BEncodeBitTorrent格式编码数据bson4jackson增加了对BSON数据格式的支持EXIficient EXIficient中支持高效的XML交换jackson-dataformat-msgpack 支持MessagePack格式HOCON支持HOCON格式Rison:支持Rison
4.3.5 JVM 模块
除了 Java还支持基于JVM的其他语言
Kotlin 处理原生类型的KotlinScala 处理原生Scala类型目前Scala 2.9支持到Jackson 2.3Scala 2.10支持到Jackson 2.11
4.3.6 其他模块
FasterXML团队的其他完全可用的模块包括
Afterburner使用字节码生成将数据绑定速度提高30-40%以取代对字段访问、方法/构造函数调用使用反射Guice允许来自Guice注入器和基础的Guice注解的注入值的扩展而不是标准的JacksonInjectJAXB Annotations允许使用JAXB注解作为标准Jackson注解的替代Mr Beantype materialization支持动态生成实现类不生成源代码OSGi允许通过标准的JacksonInject注解从OSGi注册表注入值Paranamer用于自动计算创建者构造函数、工厂方法参数名称的微小扩展以避免必须指定JsonProperty
4.3.7 Jackson jr
Jackson jr建立在Jackson Streaming API上但不依赖于数据绑定。因此它的大小jar和运行时内存使用量要小得多其API非常紧凑常应用于移动端。
4.4 模式支持
Jackson除了使用编码的方式来读取/写入 JSON和其他格式数据外还支持外部模式生成。其中一些功能包含在上述数据格式扩展中但是也有许多独立的Schema工具例如
jackson-jsonschema-ant-taskjsonschema-generatormbknor-jackson-jsonSchemajackson-module-jsonSchema…
4.5 处理方式
Jackson提供了三种处理JSON的方式
Streaming API 流式API将JSON内容作为离散事件读取和写入使用JsonParser、JsonGenerator进行读写操作开销最小效率最高Tree Model树模型类似于XML的DOM解析器将JSON内容使用树状结构表示比较灵活Data Binding数据绑定简单易用 Simple Data Binding简单的数据类型绑定Java基本数据类型、集合和JSON之间的转换Full Data Binding完整的数据类型绑定Java Bean和JSON之间的转换