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 Containersjackson-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-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 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-jackson:TinyTypes集成的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,即二进制JSON)Java Properties:使用隐含表示法创建嵌套结构(默认为点式,可配置),在序列化时类似地进行扁平化Protobuf:支持类似AvroSmile:支持Smile(二进制JSON),100%的API/logical模型通过流式API兼容,不更改数据绑定TOML:支持TOML,同时支持流媒体和数据绑定实现XML:支持XML,提供流和数据绑定实现,类似于JAXB的“代码优先”模式(不支持XML“模式优先”,但可以使用JAXBbean)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:处理原生类型的KotlinScala:处理原生Scala类型,目前Scala 2.9支持到Jackson 2.3,Scala 2.10支持到Jackson 2.11
4.3.6 其他模块
FasterXML团队的其他完全可用的模块包括:
Afterburner:使用字节码生成将数据绑定速度提高30-40%,以取代对字段访问、方法/构造函数调用使用反射Guice:允许来自Guice注入器(和基础的Guice注解)的注入值的扩展,而不是标准的@JacksonInjectJAXB 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-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之间的转换
相关文章:
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…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
