Jackson 2.x 系列【1】概述

有道无术,术尚可求,有术无道,止于术。

本系列Jackson 版本 2.17.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • [1. 前言](#1. 前言)
    • [2. 什么是 JSON](#2. 什么是 JSON)
    • [3. 常用 Java JSON 库](#3. 常用 Java JSON 库)
    • [4. Jackson](#4. Jackson)
      • [4.1 简介](#4.1 简介)
      • [4.2 套件](#4.2 套件)
      • [4.3 模块](#4.3 模块)
        • [4.3.1 核心模块](#4.3.1 核心模块)
        • [4.3.2 数据类型模块](#4.3.2 数据类型模块)
        • [4.3.3 Jackson JAX-RS](#4.3.3 Jackson JAX-RS)
        • [4.3.4 数据格式模块](#4.3.4 数据格式模块)
        • [4.3.5 JVM 模块](#4.3.5 JVM 模块)
        • [4.3.6 其他模块](#4.3.6 其他模块)
        • [4.3.7 Jackson jr](#4.3.7 Jackson jr)
      • [4.4 模式支持](#4.4 模式支持)

1. 前言

本篇文档重点笔记:😀😀😀记住Jackson 包含的三大核心模块😀😀😀

对于Java编程人员来说,相信大家对JSON已经很熟悉了,或多或少都用过FastjsonJacksonJSON处理工具。

大多数开发场景下,涉及到JSON时,大部分成熟的框架已经帮我们封装好了,比如Spring MVCSpring 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其实也就是字符串, 只不过元素会使用特定的符号标注。比如

json 复制代码
{"a": 1, "b": [1, 2, 3]}

在上述示例中

  • {} 双括号表示对象
  • [] 中括号表示数组
  • ""双引号内是属性或值
  • : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

3. 常用 Java JSON 库

JSON 官网中,可以看到几乎所有的编程语言都提供了对JSON的支持,基于JavaJSON库也有很多种:

国内最常用的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是当前积极开发的版本,最新稳定版本是于20240314日发布的2.17.0

4.2 套件

Jackson提供了一套适用于Java的数据处理工具,包括:

  • JSON解析 & JSON生成库
  • 数据绑定库,处理POJOJSON之间的互相转换
  • 其他数据格式库,用于处理AvroBSONCBORCSVSmileJava PropertiesProtobufTOMLXMLYAML中编码的数据
  • 大数据集格式库,如GuavaJodaPCollections

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功能的支持,能够访问构造函数和方法参数的名称,从而允许省略@JsonProperty
    • jackson-datatype-jsr310:支持JDK8新增的JSR310时间API
    • jackson-datatype-jdk8:支持除日期/时间 类型之外的JDK 8数据类型,包括Optional
  • Joda数据类型
    • jackson-datatype-joda:支持 Joda-Time日期/时间库数据类型的类型
    • jackson-datatype-joda-money:支持 Joda-Money数据类型,例如MoneyCurrencyUnit
  • 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库中的类型,如JSONObjectJSONArray

Jackson核心团队没有直接维护的其他模块:

  • jackson-datatype-bolts:支持Yandex-bolts集合类型定义的读/写类型(受函数编程启发的不可变集合)
  • jackson-datatype-commons-lang3:用于Apache commons Lang v3的类型
  • jackson-datatype-money:支持Java money
  • vavr-jackson:支持VAVRJava™8及以上版本的功能丰富且独立的功能编程)
  • jackson-datatype-json-lib:支持son-lib定义的类型
  • jackson-datatype-jts:支持GeoJSON 中的JTS Geometry
  • jackson-lombok:支持lombok
  • jackson-datatype-mongo:支持MongoDB 类型(已有替代方案)
  • jackson-module-objectify:支持Objectify数据类型
  • jackson-datatype-protobuf:支持由HubSpot开发的标准Java protobuf库定义的数据类型
  • tinytypes-jacksonTinyTypes集成的Jackson
  • jackson-datatype-vertx:支持Vert.x中用于用于读/写JsonObject 对象
4.3.3 Jackson JAX-RS

Jackson JAX-RS添加了对JAX-RS实现(如JerseyRESTeasyCXF)的数据格式支持,提供实现MessageBodyReaderMessageBodyWriter,目前支持的格式包括JSONSmileXMLYAMLCBOR

4.3.4 数据格式模块

数据格式模块支持JSON以外的数据格式,它们中的大多数只是实现流式API抽象,这样数据绑定组件就可以按原样使用,有些提供额外的数据绑定级别功能来处理模式之类的事情。

目前,以下数据格式模块是完全可用和受支持的:

  • Avro:支持Avro数据格式,具有流式实现以及对Avro架构的额外数据绑定级别支持
  • CBOR:支持CBOR数据格式(二进制JSON变体)
  • CSV:支持逗号分隔的值格式
  • Ion:支持Amazon Ion二进制数据格式(类似CBORSmile,即二进制JSON
  • Java Properties :使用隐含表示法创建嵌套结构(默认为点式,可配置),在序列化时类似地进行扁平化
  • Protobuf :支持类似Avro
  • Smile:支持Smile(二进制JSON),100%API/logical模型通过流式API兼容,不更改数据绑定
  • TOML:支持TOML,同时支持流媒体和数据绑定实现
  • XML:支持XML,提供流和数据绑定实现,类似于JAXB的"代码优先 "模式(不支持XML"模式优先 ",但可以使用JAXB bean
  • YAML:支持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 :处理原生类型的Kotlin
  • Scala :处理原生Scala类型,目前Scala 2.9支持到Jackson 2.3Scala 2.10支持到Jackson 2.11
4.3.6 其他模块

FasterXML团队的其他完全可用的模块包括:

  • Afterburner:使用字节码生成将数据绑定速度提高30-40%,以取代对字段访问、方法/构造函数调用使用反射
  • Guice:允许来自Guice注入器(和基础的Guice注解)的注入值的扩展,而不是标准的@JacksonInject
  • JAXB 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-task
  • jsonschema-generator
  • mbknor-jackson-jsonSchema
  • jackson-module-jsonSchema
  • ...
相关推荐
qq_三哥啊2 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC3 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj3 小时前
Spring事物
java·spring
IT毕设实战小研11 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋13 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员16 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋17 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
还是鼠鼠18 小时前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven
还是大剑师兰特19 小时前
Spring面试题及详细答案 125道(1-15) -- 核心概念与基础1
spring·大剑师·spring面试题·spring教程
python_13621 小时前
web请求和响应
java·spring·github