目录

Jackson 概述 与 依赖

Jackson 使用前情提要

ObjectMapper 序列化对象

JsonNode 树模型 Json 节点

Jsonson 注解设置 POJO 属性


Jackson 概述 与 依赖

1、市面上用于在 Java 中解析 Json 的第三方库,随便一搜不下几十种,其中的佼佼者有 Google 的 Gson, Alibaba 的 Fastjson 以及本文的 jackson。

2、三者不相伯仲,随着掌握一个都能满足项目中的 json 解析操作,因为 Spring Boot Web 组件默认使用的是  jackson,所以掌握 Jackjson 是非常有必要的。

3、gson 和 fastjson 使用时只需要导入一个 jar 包(或者一个依赖)即可,而 jackson 却不是全部集成在一个 jar (一个应用)内,而是分为不同的功能模块,需要使用哪些功能,则导入对应的 jar 包(或依赖)。

FasterXml Github 地址:https://github.com/FasterXML,jackson 所有的功能模块都在其中

比如 jackson-core 模块:https://github.com/FasterXML/jackson-core,其中提供了 maven 依赖:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><!-- 如可以使用最新的 2.9.7、2.9.8 版本 --><version>${jackson.version.core}</version>
</dependency>

jackson-core 二进制 jar 包下载地址:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/

其余的 jackson-xxx 模块也是同理,在其相应的项目主页中,都提供 maven 依赖与下载 jar 地址。

4、看了上面 Spring Boot Web 组件依赖 jackson 的情况就知道,使用 Jackson 导入以下 3 个主要模块基本满足开发:

jackson-core                      #maven 依赖、二进制jar包

jackson-annotations          #maven依赖、二进制jar包

jackson-databind               #maven依赖、二进制jar包

5、其中 jackson-databind 内部依赖了 jackson-annotations 与  jackson-core,所以 Maven 应用时,只要导入 databind 一个,则同时也导入了 annotations 与  core 依赖。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.0</version>
</dependency>

Jackson 使用前情提要

1、默认情况下,ObjectMapper 在序列化对象时,将实体所有的字段一 一序列化,无论这些字段是否有值,是否为 null。

2、如果实体的某个字段没有提供 getter 方法,则该字段不会被序列化。

3、Spring Boot Web 组件默认使用  jackson 进行对象的序列化与反序列化,即页面传入的参数,会自动反序列化为后台对象,后台传给前端的对象,也会序列化后输出。所以需要注意返回给页面的对象默认不能使用 Jackson 以外的 Json 库序列化,比如返回一个 Gson 的 JsonObject 给前端,则会报错,因为显然 Jackson 序列化时会失败。

4、Jackson 提供三种不同的方法来操作 JSON:

1)流式API - 使用 Stream(流) 的方式对 Json 的每一个组成部分进行最细粒度的控制,JsonParser 读取数据,JsonGenerator 写入数据。

2)树模型 - 将 JSON 文件在内存里以树的形式表示,通过 JsonNode 处理单个Json节点,类似于 XML 的 DOM 解析器。(常用)

3)databind 模块 - ObjectMapper 读/写 JSON 是 POJO 序列化与反序列化 json 最方便的方式。(常用)

ObjectMapper 序列化对象

1、ObjectMapper 主要用于对 Java 对象(比如 POJO、List、Set、Map 等等)进行序列化与反序列化。

2、ObjectMapper 除了能在 json 字符串与 Java 对象之间进行转换,还能将 json 字符串与 JsonNode 进行转换。

Java 对象与 Json 字符串的转换
String writeValueAsString(Object value)

1、用于将任何 Java 对象(如 POJO、List、Set、Map等)序列化为 json 字符串,如果对象中某个属性的值为 null,则默认也会序列化为 null;

2、如果 value 为 null,返回序列化的结果也返回 null

byte[] writeValueAsBytes(Object value)

将 java 对象序列化为 字节数组

writeValue(File resultFile, Object value)

将 java 对象序列化并输出指定文件中

writeValue(OutputStream out, Object value)

将 java 对象序列化并输出到指定字节输出流中

writeValue(Writer w, Object value)

将 java 对象序列化并输出到指定字符输出流中
T readValue(String content, Class<T> valueType)

1、从给定的 JSON 字符串反序列化为 Java 对象;

2、content 为空或者为 null,都会报错
3、valueType 表示反序列化的结果对象,可以是任何 java 对象,比如 POJO、List、Set、Map 等等.

T readValue(byte[] src, Class<T> valueType) 将 json 内容的字节数组反序列化为 java 对象
T readValue(File src, Class<T> valueType) 将本地 json 内容的文件反序列化为 java 对象
T readValue(InputStream src, Class<T> valueType) 将 json 内容的字节输入流反序列化为 java 对象
T readValue(Reader src, Class<T> valueType) 将 json 内容的字符输入流反序列化为 java 对象

T readValue(URL src, Class<T> valueType)
通过网络 url 地址将 json 内容反序列化为 java 对象
Json 字符串内容反序列化为 Json 节点对象
JsonNode readTree(String content) 将 JSON 字符串反序列化为 JsonNode 对象,即 json 节点对象
JsonNode readTree(URL source) 对网络上的 json 文件进行反序列化为 json 节点对象
JsonNode readTree(InputStream in) 对 json 文件输入流进行反序列化为 json 节点对象
JsonNode readTree(byte[] content) 对 json 字节数组反序列化为 json 节点对象
JsonNode readTree(File file) 将本地 json 文件反序列为为 json 节点对象
Java 对象与 Json 节点对象的转换
T convertValue(Object fromValue, Class<T> toValueType) 将 Java 对象(如 POJO、List、Map、Set 等)序列化为 Json 节点对象。
T treeToValue(TreeNode n, Class<T> valueType)

json 树节点对象转 Java 对象(如 POJO、List、Set、Map 等等)

TreeNode 树节点是整个 json 节点对象模型的根接口。

API 演示源码:src/main/java/com/wmx/jackson/ObjectMapperTest.java · 汪少棠/apache-study - Gitee.com

JsonNode 树模型 Json 节点

1、JsonNode 表示 json 节点,整个节点模型的根接口为 TreeNode,json 节点主要用于手动构建 json 对象。

2、JsonNode 有各种数据类型的实现类,其中最常用的就是 ObjectNode 与 ArrayNode,前者表示 json 对象,后者表示 json 对象数组。

3、json 节点对象可以通过 JsonNodeFactory 创建,如 JsonNodeFactory.instance.objectNode();

JsonNode json节点通用方法
JsonNode get(String fieldName) 用于访问对象节点的指定字段的值,如果此节点不是对象、或没有指定字段名的值,或没有这样名称的字段,则返回 null。
JsonNode get(int index)JsonNode get(int index)

访问数组节点的指定索引位置上的值,对于其他节点,总是返回 null.

如果索引小于0,或等于、大于节点大小,则返回 null,对于任何索引都不会引发异常。

boolean isArray() 判断此节点是否为 {@link ArrayNode} 数组节点
boolean isObject() 如果此节点是对象节点,则返回 true,否则返回 false
int size() 获取 json 节点的大小,比如 json 对象中有多少键值对,或者 json 数组中有多少元素。
ObjectNode deepCopy() json 节点对象深度复制,相当于克隆
Iterator<String> fieldNames() 获取 json 对象中的所有 key
Iterator<JsonNode> elements() 如果该节点是JSON数组或对象节点,则访问此节点的所有值节点,对于对象节点,不包括字段名(键),只包括值,对于其他类型的节点,返回空迭代器。
boolean has(int index) 检查此节点是否为数组节点,并是否含有指定的索引。

boolean has(String fieldName)

检查此节点是否为 JSON 对象节点并包含指定属性的值。

将 json 属性的值转为 java 数据类型

int asInt()
int asInt(int defaultValue)

asInt():尝试将此节点的值转换为 int 类型,布尔值 false 转换为 0,true 转换为 1。如果不能转换为 int(比如值是对象或数组等结构化类型),则返回默认值 0 ,不会引发异常。

asInt(int defaultValue):设置默认值

boolean asBoolean()
boolean asBoolean(boolean defaultValue)

尝试将此节点的值转换为 Java 布尔值,0以外的整数映射为true,0映射为false,字符串“true”和“false”映射到相应的值。

如果无法转换为布尔值(包括对象和数组等结构化类型),则返回默认值 false,不会引发异常。

可以自己设置默认值。

asText(String defaultValue)

String asText()

如果节点是值节点(isValueNode 返回 true),则返回容器值的有效字符串表示形式,否则返回空字符串。

long asLong()

long asLong(long defaultValue)

与 asInt 同理

double asDouble()
double asDouble(double defaultValue)

尝试将此节点的值转换为 double,布尔值转换为0.0(false)和1.0(true),字符串使用默认的Java 语言浮点数解析规则进行解析。

如果表示不能转换为 double(包括对象和数组等结构化类型),则返回默认值 0.0,不会引发异常。

BigInteger bigIntegerValue()

返回此节点的整数值(BigDecimal),当且仅当此节点为数字时(isNumber}返回true)。

对于其他类型,返回 BigInteger.ZERO。

boolean booleanValue() 用于访问 JSON 布尔值(值文本“true”和“false”)的方法,对于其他类型,始终返回false
BigDecimal decimalValue() 返回此节点的浮点值 BigDecimal, 当且仅当此节点为数字时(isNumber 返回true),对于其他类型,返回 BigDecimal.ZERO
double doubleValue() 返回此节点的64位浮点(双精度)值,当且仅当此节点为数字时(isNumber返回true),对于其他类型,返回0.0。
float floatValue() 返回此节点的32位浮点值,当且仅当此节点为数字时(isNumber返回true),对于其他类型,返回0.0。
int intValue()
long longValue()
Number numberValue()
short shortValue()
String textValue()
返回此节点的 int、long、Number、short、String 值。
ObjectNode 对象节点常用方法

ObjectNode put(String fieldName, String v)
ObjectNode put(String fieldName, int v)

1、将字段的值设置为指定的值,如果字段已经存在,则更新值,value 可以为 null.

2、其它 8  种基本数据类型以及 String、BigDecimal、BigInteger 都可以 put,但是没有 Date 类型

3、Date 日期类型只能通过 Long 长整型设置

ArrayNode putArray(String fieldName) 构造新的 ArrayNode 子节点,并将其作为此 ObjectNode 的字段添加。
ObjectNode putNull(String fieldName): 为指定字段添加 null 值,put 
ObjectNode putObject(String fieldName) 构造新的 ObjectNode 字节的,并将其作为此 ObjectNode 的字段添加。
替换与删除元素
JsonNode replace(String fieldName, JsonNode value) 将特定属性的值替换为传递的值,字段存在时更新,不存在时新增
JsonNode set(String fieldName, JsonNode value) 设置指定属性的值为 json 节点对象,字段存在时更新,不存在时新增,类似 replace 方法
JsonNode setAll(Map<String,? extends JsonNode> properties) 同时设置多个 json 节点
JsonNode setAll(ObjectNode other) 添加给定对象(other)的所有属性,重写这些属性的任何现有值.
ArrayNode withArray(String propertyName) 将 json 节点转为 json 数组对象
ObjectNode with(String propertyName) 将 json 节点转为 ObjectNode 对象
JsonNode remove(String fieldName) 删除指定的 key,返回被删除的节点
ObjectNode remove(Collection<String> fieldNames) 同时删除多个字段
ObjectNode removeAll() 删除所有字段属性
JsonNode without(String fieldName): 删除指定的 key,底层也是 remove
ObjectNode without(Collection<String> fieldNames) 同时删除多个字段,底层也是 removeAll
ArrayNode 数组节点常用方法
ArrayNode add(String v)

将指定的字符串值添加到此 json 数组的末尾,其它数据类型也是同理。

除了可以添加 String 类型,还有 Java 的 8 种基本数据类型,以及 BigDecimal、BigInteger、JsonNode 类型。

ArrayNode addAll(ArrayNode other) 用于添加给定数组的所有子节点
ArrayNode addNull() 该方法将在此数组节点的末尾添加 null 值。
ArrayNode addArray() 构造新的 ArrayNode 子节点,并将其添加到此数组节点的末尾
ObjectNode addObject() 构造一个新的 ObjectNode 字节的,并将其添加到此数组节点的末尾

API 演示源码:src/main/java/com/wmx/jackson/JsonNodeTest.java · 汪少棠/apache-study - Gitee.com

Jsonson 注解设置 POJO 属性

1、ObjectMapper  序列化 POJO 对象为 json 字符串时,Date 日期类型默认会转为 long 长整型,json 字符串反序列化为 POJO 时自动将长整型的日期转为 Date 类型。

2、Map 对象序列化为 json 字符串时,Map 中的日期值也会默认转为 long 长整型, ObjectMapper.readValue(String content, Class<T> valueType):反序列化为 Map 对象时,长整型的日期仍旧是长整型,不会转回 Date。ObjectMapper.readTree(String content) 反序列化为 json 节点时,原来 Map 中的长整型的日期也会是长整型。

3、JsonNode 节点对象 put 数据时,有 8  种基本数据类型以及 String、BigDecimal、BigInteger,但是没有 Date 类型,所以日期类型只能通过 Long 长整型设置,但是转 POJO 对象时仍然会自动转为 Date 类型。

4、Google 的 gson 默认不会序列化对象中值为 null 的字段,而 jackson 则不管值是否为 null,都会序列化。

5、@JsonFormat 注解加到指定对象的属性上可以指定日期序列化的格式。

6、@JsonInclude(JsonInclude.Include.NON_NULL) 添加到 POJO 对象上,表示对值为 null 的属性不进行序列化。

API 演示源码:src/main/java/com/wmx/jackson/Book.java · 汪少棠/apache-study - Gitee.com

src/main/java/com/wmx/jackson/AnnotationTest.java · 汪少棠/apache-study - Gitee.com

Jackson API 详细汇总 与 使用介绍相关推荐

  1. Jackson使用详细介绍

    Jackson使用详细介绍 一 . Jackson 介绍 二. Jackson Maven 依赖 三. ObjectMapper 对象映射器 四. Jackson JSON 基本操作 1. Jacks ...

  2. Redis之Hash超详细API使用及应用场景介绍,不看亏了!

    j3_liuliang Redis常用API即应用场景系列(Hash),如果觉得有用可以关注博主,不定时更新哦! 相关文章导航 超详细Redis之Key操作API,什么?看不懂!你来锤我 Redis之 ...

  3. cesium 的 API 结构及Viewer的介绍

    Cesium从入门到项目实战总目录: 点击 1.cesium 的 API 结构 以下是Cesium的所有API汇总: Core:核心模块,包含Cesium的基础构件.数据结构.算法等. Scene:场 ...

  4. swagger注释API详细说明

    API详细说明 注释汇总 作用范围 API 使用位置 对象属性 @ApiModelProperty 用在出入参数对象的字段上 协议集描述 @Api 用于controller类上 协议描述 @ApiOp ...

  5. 二分查找算法详细汇总

    二分查找算法详细汇总 文章目录 二分查找算法详细汇总 二分查找算法介绍模板 算法思想 举例说明 模板实现 (1)递归方式实现 (2)非递归方式实现 二分查找问题相关难点问题1[前缀和 + 二分查找 + ...

  6. HTML5 postMessage 和 onmessage API 详细应用

    HTML5 postMessage 和 onmessage API 详细应用 在学习HTML5的时候发现一位大神的博文,解决了个人的很多疑惑,转载分享给大家 原文地址:https://www.cnbl ...

  7. 好玩的人脸识别face_recognition安装+尝试+API详细

    face_recognition是一个可玩度很高的人脸识别开源框架,不仅安装方便,运行起来也很轻松. 官网:https://github.com/ageitgey/face_recognition.g ...

  8. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

  9. IBM Java多线程 - 6.其它线程 API 详细信息

    其它线程 API 详细信息 1. wait().notify() 和 notifyAll() 方法 2. 线程优先级 3. 线程组 4. SwingUtilities wait().notify() ...

  10. JavaScript一些常用 API整理汇总

    JavaScript一些常用 API整理汇总 Array new Set() 数组去重 const arr = [3,4,4,5,4,6,5,7]; console.log(new Set(arr)) ...

最新文章

  1. python实现e2lsh高维数据集k近邻搜索——实现流程
  2. 好系统重装助手教您如何设置宽带并连接无线上网
  3. 9300万美元投资涌入 新加坡成亚太最大数据中心
  4. 中年人在“洗脑课”上迷了路
  5. centos7.6arm安装mysql8.0.17_Centos yum安装 MySQL 5.7
  6. as3文本框的动态拖拽和编辑
  7. Linux+Tomcat建站笔记(JDK,Mysql,Vsftpd,Iptables等配置)
  8. 轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发
  9. (2)散列表是怎么进行查找的
  10. [转]亚稳态和毛刺 - Metastability and Hazard(CN)
  11. TensorFlow2.0:梯度计算
  12. [转载] python迭代器
  13. Citrix XenApp工作原理
  14. L2-011 玩转二叉树 (25分)
  15. 双卡双待的iPhone终于要来了?中国特供了解一下!
  16. 10款最佳项目管理工具推荐
  17. 解决许可证的相关问题
  18. 解决:Mac “微信”意外退出
  19. 大数据分析的好帮手 Excel函数应用的顶级实战 Excel数据分析应用+VBA实战 24G课程
  20. 综述 | 目标检测中的多尺度检测方法

热门文章

  1. 再谈 最速下降法/梯度法/Steepest Descent
  2. vue登录如何存储cookie_vue登录模块,登录状态应该存在哪里,怎么防止手动改cookie、localStorage?...
  3. 拓端tecdat|R语言Copula估计边缘分布模拟收益率计算投资组合风险价值VaR与期望损失ES
  4. gamma分布 pytorch_pytorch之添加BN的实现
  5. 图像处理-形态学运算
  6. python使用自制程序_python--自制程序性能检测工具
  7. python整数作为条件_Python基本概念介绍
  8. 淘沙潜行,数一数英雄的多姿,王者荣耀英雄、皮肤、武器展览
  9. 聚类算法(K-Means和DBSCAN)
  10. 2021-06-18 链接标签