Jackson API指南

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jackson API指南相关的知识,希望对你有一定的参考价值。

一.Jackson 概述 与 依赖

1.市面上用于在 Java 中解析 Json 的第三方库,随便一搜不下几十种,其中的佼佼者有 Google 的 GsonAlibaba 的 Fastjson以及本文的 jackson。
2.我们在学习一门技术之前,首选要了解这门技术的优劣性,以及它和同等技术的对比。fastjson这么快老外为啥还是热衷 jackson?
3.使用 Jackson 导入 jackson-databind、 jackson-annotations、jackson-core 3 个主要模块基本满足开发,其中 jackson-databind内部依赖了 jackson-annotations 与 jackson-core ,所以 Maven 应用时,只要导入 jackson-databind 一个,则同时也导入了 jackson-annotations 与 jackson-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 对象序列化并输出到指定字节输出流中
T readValue(String content, Class valueType)1、从给定的 JSON 字符串反序列化为 Java 对象;2、content 为空或者为 null,都会报错;3、valueType 表示反序列化的结果对象,可以是任何 java 对象,比如 POJO、List、Set、Map 等等.
T readValue(byte[] src, Class valueType)将 json 内容的字节数组反序列化为 java 对象
T readValue(File src, Class valueType)将本地 json 内容的文件反序列化为 java 对象
T readValue(InputStream src, Class valueType)将 json 内容的字节输入流反序列化为 java 对象
T readValue(Reader src, Class valueType)将 json 内容的字符输入流反序列化为 java 对象
T readValue(URL src, Class valueType)通过网络 url 地址将 json 内容反序列化为 java 对象

五.Json 字符串内容反序列化为 Json 节点对象

六.Java 对象与 Json 节点对象的转换

七.JsonNode 树模型 Json 节点

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

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

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

八.JsonNode json节点通用方法

九.Json 属性的值转为 java 数据类型


十.ObjectNode 对象节点常用方法

十一.替换与删除元素

十二.ArrayNode 数组节点常用方法

十三.Jsonson 注解设置 POJO 属性

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

2.Map 对象序列化为 json 字符串时,Map 中的日期值也会默认转为 long 长整型, ObjectMapper.readValue(String content, Class 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 的属性不进行序列化。

以上是关于Jackson API指南的主要内容,如果未能解决你的问题,请参考以下文章

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

Jackson工具类使用及配置指南高性能配置(转)

微信小程序入门-指南针

Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段

使用Jackson – 将字符串转换为 JsonNode 对象

jackson 流式API