jackson序列化(jackson codec)

Jackson 是一个用于 Java 平台的开源 JSON 库,它提供了灵活且高效的方式来处理 JSON 数据的序列化(Java对象 → JSON字符串)和反序列化(JSON 字符串→ Java对象)。

以下是 Jackson 的一些主要特点和功能:

  1. 高性能:Jackson 通过使用基于流的处理模型和性能优化技术,提供了出色的性能。它支持快速的数据绑定和处理大型 JSON 数据。

  2. 灵活性:Jackson 支持多种数据格式,包括 JSON、Smile(二进制 JSON 格式)和 XML。它可以处理复杂的对象关系和嵌套结构,并支持自定义序列化和反序列化规则。

  3. 注解支持:Jackson 提供了一系列注解(如 @JsonProperty@JsonIgnore@JsonFormat 等)来控制序列化和反序列化的行为。通过注解,你可以指定字段名称、忽略特定字段、格式化日期和时间等。

  4. 支持泛型和多态:Jackson 支持序列化和反序列化泛型类型,以及处理多态类型的对象。它提供了类型擦除解决方案和多态类型的标记(如 @JsonTypeInfo@JsonSubTypes 等)。

  5. 可定制性:Jackson 提供了丰富的配置选项和可扩展的 API,使你能够根据需求进行定制。你可以自定义序列化器和反序列化器,注册模块扩展功能,以及处理特定的数据转换和验证逻辑。

  6. 整合性:Jackson 可以与各种 Java 框架和库进行无缝集成,如 Spring、Hibernate、JAX-RS 等。它可以轻松地与其他库一起使用,以提供全面的数据处理解决方案。

Spring MVC 默认使用 Jackson 库进行 JSON 的序列化和反序列化,无需额外的配置。

当你返回一个对象时,Spring MVC 将自动使用 Jackson 库将该对象序列化为 JSON 字符串,并将其作为响应的主体返回给客户端。

同样地,当你使用 @RequestBody 注解标记的方法参数时,Spring MVC 将使用 Jackson 库将请求体中的 JSON 数据反序列化为对应的 Java 对象。

SpringBoot项目自动依赖了 Jackson 库。 非SpringBoot项目,使用 Jackson 库,可能需要在项目中添加 Jackson 库依赖。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version>
</dependency>
View Code

下面是一个使用 Jackson 库进行对象序列化和反序列化的示例

package jstudy.jackson;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;/*** 使用 Jackson 库进行对象序列化和反序列化的示例类*/
public class JacksonSerializationDemo {public static void main(String[] args) {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建一个示例对象Person person = new Person("John Doe", 30);try {// 对象序列化为 JSON 字符串String json = objectMapper.writeValueAsString(person);System.out.println("Serialized JSON: " + json);// JSON 字符串反序列化为对象Person deserializedPerson = objectMapper.readValue(json, Person.class);System.out.println("Deserialized Person: " + deserializedPerson);} catch (JsonProcessingException e) {e.printStackTrace();}}@Datastatic class Person {private String name;private Integer age;private String address;// 必须提供默认构造函数,以便 Jackson 库能够实例化对象public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}}
}

代码运行结果:

Serialized JSON: {"name":"John Doe","age":30,"address":null}
Deserialized Person: JacksonSerializationDemo.Person(name=John Doe, age=30, address=null)

BTW,上面示例类  JacksonSerializationDemo 可以rename为 JacksonCodecDemo

"Codec" 一词通常用于指代编码器-解码器(Encoder-Decoder)或编码-解码(Encode-Decode)的概念。将示例重命名为 "JacksonCodecDemo" 可以更准确地表达其涵盖了序列化和反序列化的功能。

通过将示例命名为 "JacksonCodecDemo",强调了 Jackson 库不仅实现了对象到 JSON 的序列化(即编码)功能,还具备将 JSON 转换回对象的反序列化(即解码)功能。

这种重命名方式能够更清晰地传达代码示例的目的。

日常开发中,我们也要关注命名。良好的命名规范是高质量代码的基石之一。在 Java 中,命名规范不仅帮助保持代码的整洁性和一致性,还能极大地提高代码的可读性和可维护性。

如何控制 Jackson 在序列化对象时不包含全是 null 的字段?

要在 Jackson 中避免序列化全是 null 的字段,你可以使用 Jackson 的配置选项来控制序列化行为。

以下是两种常用的方法:

1. 使用 ObjectMapper 的 setSerializationInclusion 方法设置序列化包含规则为 JsonInclude.Include.NON_NULL。这意味着只有非空字段才会被序列化,而全是 null 的字段将被忽略。

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;public class JacksonSerializationDemo {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// ... 省略其他代码 ...}
}

2. 使用 @JsonInclude 注解在类级别设置序列化包含规则为 JsonInclude.Include.NON_NULL。这将仅对被注解的类有效。

import com.fasterxml.jackson.annotation.JsonInclude;@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {// ... 省略其他代码 ...
}
BTW,我司系统是前后端分离模式,为提高开发效率,我们约定给前端页面所提供的后端接口,只返回明确需要的字段。例如:企业客户信息,后端有一个 EnterpriseVO,包含了企业的基本信息和资质信息。不过,查询企业客户基本信息API、查询企业客户资质信息API,不能返回 EnterpriseVO 的所有字段。此时,要满足这个就可以用上面的 Jackson不序列化null字段的方式来解决。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内环境,怎么做开源才能兼顾生存和情怀?

回答一个朋友提的问题—— 在国内&#xff0c;开源怎么做呢&#xff1f;老夫结合自己多年在开源和商业领域的经历与见闻聊聊。 首先来说&#xff0c;毋庸置疑&#xff0c;开源是对传统的商业模式的一种颠覆&#xff0c;它以一种免费开放的姿态赢得了Hacker群体的心&#xff0c…

mac OS matplotlib missing from font(s) DejaVu Sans

如果能搜索到这篇文章&#xff0c;我猜你遇到了和我一样的问题&#xff1a;matplotlib绘图中文乱码。如下&#xff1a; 出现这个问题的原因是&#xff1a;matplotlib使用的字体列表中默认没有中文字体。 这里说一种解决方案&#xff1a;我们可以在文件中手动指定matplotlib使用…

微信小程序-使用Component方法代替Page方法构造页面

一.使用Component方法的前提条件 在小程序js文件里使用Component方法代替Page方法需要在json文件里面定义usingComponents属性 {"usingComponents": {} }二.注意事项 1.在page页面里使用的钩子函数和事件监听方法都需要写在methods对象里面 methods:{update(){thi…

WHAT - Web Components 和 Vue、React 的模块化组件

目录 Web Components介绍组件库1. Lit2. Vaadin3. Shoelace4. Stencil5. FAST6. Ionic7. UI5 Web Components8. PatternFly Elements使用和选择指南结论 与 Vue 或 React 组件的区别1. 原生 vs 框架依赖2. 样式和 DOM 隔离3. 使用和学习曲线4. 状态管理和生命周期 专题&#xf…

二叉树详解-第一篇 树以及二叉树的概念

目录 ​编辑 1.树的概念及结构 1.1树的概念 1.2树的特点 1.3树的相关概念 1.4树的表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊二叉树-满二叉树和完全二叉树 1.满二叉树的概念及性质 2.完全二叉树的概念及性质 2.3二叉树的性质(重点) 2.4二叉树的存储 1.顺…

LeetCode - #103 二叉树的锯齿形层序遍历

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

沉淀硬化不锈钢压缩弹簧的主要特性

沉淀硬化不锈钢&#xff0c;作为一种兼具高强度与耐腐蚀性的合金材料&#xff0c;被广泛应用于制造高性能的压缩弹簧&#xff0c;尤其是在苛刻环境下的应用需求。以下是对沉淀硬化不锈钢压缩弹簧主要特性的科普介绍&#xff1a; 良好的耐蚀性 沉淀硬化不锈钢与304不锈钢拥有相似…

做个牛奶配送小程序商城是怎样的

商家线上经营奶品&#xff0c;主要是成品包装品牌奶或散奶周边客源生意模式等&#xff0c;无论哪些模式&#xff0c;本身奶产品的需求度就不低&#xff0c;自然也有着大量客户&#xff0c;农场/品牌厂商/经销商/小摊贩&#xff0c;除了线下实体店发展外&#xff0c;线上要完善本…

SpringCloud断路器的使用与原理解析

Spring Cloud断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。 Spring Cloud断路器的使用与原理解析如下: 一、使用断…

KunDB4.0:安全能力与Oracle兼容性提升,支持跨系统多租户部署

KunDB是星环科技自主研发的分布式交易型数据库&#xff0c;高度兼容Oracle和MySQL&#xff0c;提供数据强一致、高可用、高性能、高扩展、应用透明等能力&#xff0c;可在云上和物理机上容器化部署运行&#xff0c;一站式解决企业数据存储、管理、计算与安全性问题。 过去半年…

数据结构经典测题3

1. 设有定义&#xff1a; char *p; &#xff0c;以下选项中不能正确将字符串赋值给字符型指针 p 的语句是【多选】&#xff08; &#xff09; A: pgetchar(); B: scanf("%s",p); C: char s[]"china"; ps; D: *p"china"; 答案为ABD A选项&…

SQL Server中 LOP_FORMAT_PAGE日志记录解释

在SQL Server中&#xff0c;LOP_FORMAT_PAGE是日志记录的一种类型&#xff0c;用于描述页面的格式化操作。了解LOP_FORMAT_PAGE详细的背景和任务类型有助于深入理解SQL Server的内部机制&#xff0c;尤其是在恢复和日志管理方面。以下是有关LOP_FORMAT_PAGE的详细解释&#xff…

如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?

摘要 在互联网时代&#xff0c;数据的价值日益凸显。对于电商网站如京东&#xff0c;其商品信息、用户评价等数据对于市场分析、产品定位等具有重要意义。然而&#xff0c;由于这些网站通常使用 JavaScript 动态生成内容&#xff0c;传统的爬虫技术难以直接获取到完整数据。本…

pyaudio VAD通过声音音频值分贝大小检测没人说话自动停止录制

效果可能说话声音小可能不被监听到,需要更改QUIET_DB阈值,另外delay_time值是低于阈值多久就可以停止保存当前的语音 import pyaudio import waveimport sys import numpy as npdef record_auto(MIC_INDEX=1):开启麦克风录音,保存至temp/speech_record.wav音频文件音量超过…

洛谷 P1151 子数整数 题解

题目描述 对于一个五位数 a1​a2​a3​a4​a5​​&#xff0c;可将其拆分为三个子数&#xff1a; &#x1d460;&#x1d462;&#x1d44f;1&#x1d44e;1&#x1d44e;2&#x1d44e;3 &#x1d460;&#x1d462;&#x1d44f;2&#x1d44e;2&#x1d44e;3&#x1d44…

vue3 reactive原理(二)-代理Set和Map及ref原理

Set和Map类型的数据也属于异质对象&#xff0c;它们有特定的属性和方法用来操作自身。因此创建代理时&#xff0c;针对特殊的方法需要特殊的对待。 Vue 的ref 是基于reactive函数实现的&#xff0c;它在其基础上&#xff0c;增加了基本类型的响应性、解决reactive在解构时丢失…

目标检测原理分析

目标检测 图像分类&#xff08;一张图像只属于一个类别&#xff09;目标检测&#xff08;一张图像有N个物体&#xff09; 图像分类&#xff08;一张图像只属于一个类别&#xff09; 输入&#xff1a; 一张图像&#xff0c;image 输出&#xff1a; 这张图像属于各个预定义类别的…

【Unity实战】yield return null还是WaitForEndOfFrame

当在Unity中编写协程&#xff08;尤其是协程套无限循环&#xff09;时&#xff0c;常常会用到yield关键字来控制协程的执行流程避免程序假死。以下是常见做法&#xff1a; yield return null 当使用yield return null时&#xff0c;协程会在下一帧继续执行。这意味着协程将暂…

SSM超市管理系统-计算机毕业设计源码12393

目 录 摘要 Abstract 1 绪论 1.1研究的背景和意义 1.2研究内容 1.3论文结构与章节安排 2 开发技术介绍 2.1 SSM框架 2.2 MySQL数据库 3 超市管理系统系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据流程 3.3.2 业务流程 3.3 系统功能分析 3.3.1 功能性…

机器学习 | 回归算法原理——最速下降法(梯度下降法)

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最小二乘法继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享最速下降法&#xff08;梯度下降法&#xff09;这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…