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已经很熟悉了,或多或少都用过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其实也就是字符串, 只不过元素会使用特定的符号标注。比如

{"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

4.5 处理方式

Jackson提供了三种处理JSON的方式:

  • Streaming API流式API,将JSON内容作为离散事件读取和写入,使用JsonParserJsonGenerator进行读写操作,开销最小,效率最高
  • Tree Model树模型,类似于XMLDOM解析器,将JSON内容使用树状结构表示,比较灵活
  • Data Binding数据绑定,简单易用
    • Simple Data Binding简单的数据类型绑定Java基本数据类型、集合和JSON之间的转换
    • Full Data Binding完整的数据类型绑定Java BeanJSON之间的转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479430.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

002_avoid_for_loop_in_Matlab避免使用for循环

避免使用for循环 在程序设计思想中,循环是一个很有力的工具。在循环中,计算机很轻松地重复执行相同的操作。循环是汇编之上的编程中最重要的概念之一。Matlab的循环有两个语言构造,一个是for循环,另一个是while循环。在Matlab中&…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题,它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce,到今天的 Spark,各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展,…

【Web】记录CISCN 2021 总决赛 ezj4va题目复现——AspectJWeaver

目录 前言 原理分析 step 0 step 1 EXP 前文:【Web】浅聊Java反序列化之AspectJWeaver——任意文件写入-CSDN博客 前言 这就是当年传说中的零解题嘛😭,快做🤮了 有了之前的经验,思路顺挺快的,中间不…

TextMeshPro图文混排的两种实现方式,不打图集

TMP图文混排 方案一:TMP自带图文混排使用方法打包图集使用 方案二:不打图集,可以使用任何图片 接到一个需求,TextMeshPro 图文混排。 方案一:TMP自带图文混排 优点布局适应优秀,字体左中右布局位置都很不错…

python第三次项目作业

打印课堂上图案 判断一个数是否是质数(素数) 设计一个程序,完成(英雄)商品的购买(界面就是第一天打印的界面) 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票&a…

【Vue3】走进Pinia,学习Pinia,使用Pinia

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

骑砍战团MOD开发(49)-使用ScoEditor编辑sco文件制作游戏场景

一.ScoEditor下载霸王•吕布 / ScoEditor GitCodehttps://gitcode.net/qq_35829452/scoeditor二.ScoEditor导出文件种类 mission_objects.json:场景物/出生点/通道等物体 layer_ground_elevation.pfm:场景terrain/ground地形增量,采用PFM深度图存储 ai_mesh.obj:AI网格静态模型…

购买阿里云服务器,有啥优惠吗?

购买阿里云服务器,有啥优惠吗?有的。2024年腾讯云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步…

[Linux]互斥锁(什么是锁,为什么需要锁,怎么使用锁(接口),演示代码)

目录 一、锁的概念 一些需要了解的概念 什么是锁?为什么需要锁?什么时候使用锁?怎么定义锁? 二、锁的接口 1.初始化锁 2.加锁 3.申请锁 4.解锁 5.销毁锁 三、实践(写代码):黄牛抢票 一…

Matlab有限差分法求解狄利克雷(Dirichlet)边界的泊松(Poisson)问题,边界值为任意值

参考l链接: 有限差分法-二维泊松方程及其Matlab程序实现弹性力学方程 有限差分法matlab,泊松方程的有限差分法的MATLAB实现 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Matrix method for Poisson Equation %%%% %%% …

用redis lua脚本实现时间窗分布式限流

需求背景: 限制某sql在30秒内最多只能执行3次 需求分析 微服务分布式部署,既然是分布式限流,首先自然就想到了结合redis的zset数据结构来实现。 分析对zset的操作,有几个步骤,首先,判断zset中符合rangeS…

express+mysql+vue,从零搭建一个商城管理系统15--快递查询(对接快递100)

提示:学习express,搭建管理系统 文章目录 前言一、安装md5,axios二、新建config/logistics.js三、修改routes/order.js四、查询物流信息五、试错与误区总结 前言 需求:主要学习express,所以先写service部分 快递100API…

纹波和噪声有啥区别(一)

首先要知道的是他们都是在电源输出中出现的信号波动,但两者存在明显的区别。 一,纹波的产生 电源纹波是指电源输出时,叠加在稳定的直流电源上的交流成分。 这种波动主要是由于电源自身的开关、PWM 调节等因素引起的,其频率一般…

python的stone音乐播放器的设计与实现flask-django-php-nodejs

该系统利用python语言、MySQL数据库,flask框架,结合目前流行的 B/S架构,将stone音乐播放器的各个方面都集中到数据库中,以便于用户的需要。该系统在确保系统稳定的前提下,能够实现多功能模块的设计和应用。该系统由管理…

Word文档密码设置:Python设置、更改及移除Word文档密码

给Word文档设置打开密码是常见的Word文档加密方式。为Word文档设置打开密码后,在打开该文档时,需要输入密码才能预览及编辑,为Word文档中的信息提供了有力的安全保障。如果我们需要对大量的Word文档进行加密、解密处理,Python是一…

3.C#对接微信Native支付(注册微信支付)

在完成了所有的准备工作之后,我们开始进行实际的对接工作,由于官方没有提供C#版本的SDK我们需要自己手动实现所有的功能,介于再去研究文档太麻烦我们借助第三方的sdk 盛派微信 SDK 它是由苏震巍先生发起的国内知名的 .NET 开源项目。https://…

ZYNQ 自定义AXI接口 IP(PWM)

系统框图 1 FPGA PWM源码 / // Description: pwm model // pwm out period frequency(pwm_out) * (2 ** N) / frequency(clk); // // // Revision History: // Date By Revision Change Description //--------------------------------------…

Vue2(七):超详细vue开发环境搭建(win7),nodejs下载与安装,安装淘宝镜像(报错已解决),配置脚手架

一、安装node.js 本来想粗略写一下的,但是搭建脚手架的时候,遇到了很多问题,浪费快两天时间,记录一下自己的解决办法希望对你们有帮助! 1.下载nodejs 安装包下载链接【CNPM Binaries Mirror】 下载我划线的这个&am…

vue学习日记14:工程化开发脚手架Vue CLI

一、概念 二、安装 1.全局安装&查看版本 注意启动cmd输入命令 要以管理员运行哦 安装了一次就行以后不用再创建了 yarn global addvue/cli vue --version 显示了版本号即可 2.创建项目架子 创建项目的路径在哪 项目就在哪 项目名字不能用中文 vue create project-n…

命令提示符——CMD基础操作介绍

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…