Jackson 2.x 系列【1】概述
有道无术,术尚可求,有术无道,止于术。
本系列Jackson 版本 2.17.0
源码地址:https://gitee.com/pearl-organization/study-seata-demo
文章目录
- 1. 前言
- 2. 什么是 JSON
- 3. 常用 Java JSON 库
- 4. Jackson
- 4.1 简介
- 4.2 套件
- 4.3 模块
- 4.3.1 核心模块
- 4.3.2 数据类型模块
- 4.3.3 Jackson JAX-RS
- 4.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 Notation
(JS
对象图谱),来源于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
公司开源维护Fastjson
:Java
编写的高性能的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
功能的支持,能够访问构造函数和方法参数的名称,从而允许省略@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
数据类型,例如Money
、CurrencyUnit
JSON-P
(json 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 money
vavr-jackson
:支持VAVR
(Java™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-jackson
:TinyTypes
集成的Jackson
jackson-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
,即二进制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
:支持读取/写入BEncode
(BitTorrent
格式)编码数据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.3
,Scala 2.10
支持到Jackson 2.11
4.3.6 其他模块
FasterXML
团队的其他完全可用的模块包括:
Afterburner
:使用字节码生成将数据绑定速度提高30-40%
,以取代对字段访问、方法/构造函数调用使用反射Guice
:允许来自Guice
注入器(和基础的Guice
注解)的注入值的扩展,而不是标准的@JacksonInject
JAXB Annotations
:允许使用JAXB
注解作为标准Jackson
注解的替代Mr Bean
:type 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
- …
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
之间的转换
相关文章:

Jackson 2.x 系列【1】概述
有道无术,术尚可求,有术无道,止于术。 本系列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.…...

深入理解并优化Android中的文件描述符(FD)
文章目录 一、文件描述符(FD)概述二、为什么要优化文件描述符?三、实际开发中的文件描述符优化策略3.1 及时关闭文件和资源3.2 使用try-with-resources3.3 检查并优化第三方库3.4 使用文件描述符检查工具3.4.1 使用/proc文件系统3.4.2 使用ls…...

「JS 基础」异步解决方案入门
前言 为了解决Javascript 语言的执行环境是单线程所带来的问题,Javascript 将任务的执行模式分为两种:同步和异步 同步即为后一个任务等待前一个任务结束再继续执行,程序的执行顺序与任务的排列顺序是一致的 异步则完全不同,每…...

408学习笔记-16-C-动态内存管理
1、为什么要有动态内存分配 常规定义出来的变量,它们的大小都是已经规定好的,即在内存中开辟的内存空间都是固定的;且空间大小不可调整,可能会造成内存空间的浪费。 于是C语言引入了动态内存开辟功能,让程序员自己可…...

vuex - 21年的笔记 - 后续更新
vuex是什么 Vuex是实现组件全局状态(数据)管理的一种机制,方便的实现组件之间的数据的共享 使用vuex统一管理状态的好处 能够在vuex中集中管理共享的数据,易于开发和后期维护能够高效地实现组件之间的数据共享,提高…...

ngrok实现内网穿透
在使用jenkins进行自动化部署时,需要设置github的webhook钩子来触发构建,由于jenkins运行在自己的电脑上,因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…...
开发chrome扩展( 禁止指定域名使用插件)
mainfest.json: {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons": {&quo…...
Flink:Lookup Join 实现与示例代码
本文要演示的是:在流上关联一张外部表(例如 MySQL 数据库中的一张维表),用于丰富流上的数据,实际上,这正是最普遍的 ”维表 Join“ 的实现方式。通过这种方式和外部维表关联时,依然能关联到最新变化的维度数据,所以才说这是 ”维表 Join“。Lookup Join 与 《Flink Tem…...
python基础知识(四)
if not x % 2 > if x % 2 ! 0 Python HTML和XML解析的第三方库是 Beautifull Soup 不属于软件设计原则是 自底向上 用来表示实体之间联系的是 二维表 当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的 属性(关系就是二维表)…...

论文笔记:Llama 2: Open Foundation and Fine-Tuned Chat Models
导语 Llama 2 是之前广受欢迎的开源大型语言模型 LLaMA 的新版本,该模型已公开发布,可用于研究和商业用途。本文记录了阅读该论文的一些关键笔记。 链接:https://arxiv.org/abs/2307.09288 1 引言 大型语言模型(LLMsÿ…...

Unity UGUI之Toggle基本了解
在Unity中,Toggle一般用于两种状态之间的切换,通常用于开关或复选框等功能。 它的基本属性如图: 其中, Interactable(可交互):指示Toggle是否可以与用户交互。设置为false时,禁用To…...

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日期滑动选择器弹窗)
根据指定的日期范围创建日期滑动选择器,展示在弹窗上。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用&…...
华岳M9制造企业管理软件业务流程 2/4
华岳M9制造企业管理软件业务流程 2/4 步骤3 初始一、应收账款初始余额二、应付账款初始余额三、出纳账项初始余额四、会计账项初始余额五、盘点入库六、存货细目七、存货属性设置八、存货存量控制九、存货价格管理十、月末处理 步骤4 技术一、存货目录二、存货细目三、仓库绑定…...

echarts geo地图加投影两种方法
方法1,geo中加多个地图图形,叠加。缩放时 可能会不一致,需要捕捉georoam事件,使下层的geo随着上层的geo一起缩放拖曳 geo: [{zlevel: 3,//geo显示级别,默认是0 【最顶层图形】map: BJ,//地图名roam: true,scaleLimit: …...
GPT实战系列-LangChain的Prompt提示模版构建
GPT实战系列-LangChain的Prompt提示模版构建 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…...
Docker容器中的mysql自动备份脚本
Docker容器中的mysql自动备份脚本 1. 脚本功能 备份容器中的mysql数据库到宿主机上,自动删除7天前的备份文件 2. 脚本内容 #!/bin/bash # auth Eric source /etc/profile # 设置备份目录和文件名 backup_directory"/app/backup" #测试名字用%Y%m%d%H…...

品精酿啤酒:畅享生活,享受快乐
在现代社会,品牌营销策略对于产品的成功至关重要。Fendi club啤酒之所以能够成为畅享生活、享受时尚的代名词,与其品牌营销策略密不可分。 首先,Fendi club啤酒注重品牌形象的塑造。作为一个时尚品牌,Fendi club啤酒将时尚与品质融…...

进程创建,程序加载运行,以及进程终止,什么是僵尸进程,什么是孤儿进程
进程控制 创建进程,撤销进程,实现进程转换(必须一气呵成,使用原语) 原语不被中断是因为有关中断指令 创建进程 撤销进程 进程创建fork fork()函数会创建一个子进程,子进程会返…...

[python]bar_chart_race设置日期格式
1、设置日期标签的时间格式 # 设置日期格式,默认为%Y-%m-%dbcr.bar_chart_race(df, covid19_horiz.gif, period_fmt%b %-d, %Y) 2、更改日期标签为数值 # 设置日期标签为数值bcr.bar_chart_race(df.reset_index(dropTrue), covid19_horiz.gif, interpolate_period…...

Apache FtpServer在Windows上下载安装与使用
Apache FtpServer在Windows上下载安装与使用 1、Apache Ftp Server下载 进入apache官网 https://mina.apache.org/ftpserver-project/old-downloads.html 下载自己使用的版本。 Apache FtpServer 1.1.1及以下的版本需要JDK1.7的支持 Apache FtpServer 1.1.1以上的版本需要JDK…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...