jackson对于对象序列化的时候默认空值和手动传入的null的不同处理
Jackson 在序列化对象时如何处理默认的空值和手动传入的 null,其实归结于它的序列化机制和注解配置。默认情况下,Jackson 不区分 手动设置的 null 和 对象中字段的默认空值,但可以通过配置来改变其行为。具体细节如下:
1. 默认行为:手动传入的 null 和默认空值
Jackson 在序列化时,对于对象的字段,遵循如下规则:
- 显式设置的
null:当你手动为字段赋值为null,Jackson 认为这是一个显式的null值,会将其序列化为"field": null。 - 默认
null值:如果某个字段没有被显式赋值(比如对象初始化时未赋值),其值默认为null,Jackson 可能会忽略这些null值,除非你配置让它保留这些字段。
关键在于 Jackson 的 JsonInclude 行为:
java 复制代码 @JsonInclude(JsonInclude.Include.NON_NULL)
这是 Jackson 的默认配置,意思是忽略 null 值。因此,当字段为 null 且未显式赋值时,Jackson 会将其排除在最终的 JSON 之外。
2. 手动传入 null 的情况
当你在代码中手动将字段赋值为 null 时,Jackson 视作你明确地希望该字段的值为 null,因此在序列化时会包含该字段,结果如下:
java
复制代码
class Example {public String field1;
}Example obj = new Example();
obj.field1 = null; // 手动设置为null
Jackson 序列化输出为:
json
复制代码
{"field1": null
}
这是因为 Jackson 认为你有意将 field1 赋值为 null,它会反映在最终的 JSON 中。
3. 区分手动 null 和默认 null 的配置
虽然 Jackson 本质上不区分“手动设置 null”与“默认 null”,但你可以通过配置和注解来控制 Jackson 的序列化行为。以下是一些常见的配置:
a. 全局配置 null 序列化行为
通过 Spring Boot 的配置文件,或直接在代码中配置 Jackson 的 ObjectMapper,你可以全局控制 Jackson 是否包含 null 字段:
properties 复制代码 # 在 application.properties 或 application.yml 中添加配置 spring.jackson.default-property-inclusion=always
或者在代码中设置:
java 复制代码 ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
这将让 Jackson 始终序列化 null 字段,无论它们是手动设置的还是默认的 null 值。
b. 局部控制:类或字段级别的 null 序列化
你还可以通过注解在某个类或字段上控制 null 的序列化行为。例如:
- 包含所有
null字段:
java
复制代码
@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyClass {public String field1;public String field2;
}
- 在这种情况下,
field1和field2即使为null,Jackson 也会将它们序列化到 JSON 中。 - 忽略
null字段: - 默认的 Jackson 序列化行为就是忽略
null值。如果你希望某个类或字段不包含null,可以使用以下配置:
java
复制代码
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyClass {public String field1;public String field2;
}
- 这样,当
field1或field2为null时,Jackson 将不会将它们包含在 JSON 中。
4. Jackson 的工作机制
Jackson 并不会特别区分手动设置的 null 和未显式赋值的 null。它通过以下方式来确定是否序列化:
- 字段是否显式赋值:只要某个字段被显式赋值为
null,Jackson 会认为这是开发者的明确意图,因此会包含这个null值。 - 字段默认值:如果字段默认是
null且 Jackson 被配置为忽略null值,默认情况下这些字段不会被序列化。
Jackson 通过 JsonInclude 注解或全局配置,决定是否在 JSON 中保留 null 字段。
总结
Jackson 在序列化时不严格区分手动传入的 null 和默认空值,它只关心字段的值是 null 还是非 null。但是,通过 JsonInclude 注解或配置,你可以灵活控制是否要在 JSON 中保留 null 值,确保在你需要的时候将字段序列化出来。
在 Spring MVC 中,如果返回的对象中某些字段为 null,默认情况下这些字段可能不会被序列化到 JSON 响应中,因此对方解析时看不到这些字段。这个行为主要由 Jackson(默认的 JSON 序列化框架)控制。
原因: Jackson 默认会忽略值为 null 的字段,以减少不必要的数据传输。这就是为什么当字段为 null 时,生成的 JSON 中不会包含这些字段。
解决方案:
- 全局配置:如果你希望即使字段值为
null,也要在响应的 JSON 中显示,可以通过配置 Jackson 来改变这一行为。 在application.properties或application.yml中添加以下配置:
properties 复制代码 spring.jackson.default-property-inclusion=non_null
- 这将让 Jackson 在序列化时包含
null值。 - 局部配置:你也可以通过注解的方式控制某个类或字段是否序列化
null值。 在需要包含null值的类或字段上使用@JsonInclude注解:
java
复制代码
import com.fasterxml.jackson.annotation.JsonInclude;@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyClass {private String field1;private String field2; // 可能为null
}
- 这样,即使
field2为null,也会被包含在 JSON 响应中。 - 自定义序列化:你还可以自定义序列化逻辑,决定何时包含
null值,甚至可以为null值提供默认值。
通过这些方式,你可以灵活控制对象的 null 字段在 JSON 中的表现方式。
相关文章:
jackson对于对象序列化的时候默认空值和手动传入的null的不同处理
Jackson 在序列化对象时如何处理默认的空值和手动传入的 null,其实归结于它的序列化机制和注解配置。默认情况下,Jackson 不区分 手动设置的 null 和 对象中字段的默认空值,但可以通过配置来改变其行为。具体细节如下: 1. 默认行为…...
L8打卡学习笔记
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 SVM与集成学习 SVMSVM线性模型SVM非线性模型SVM常用参数 集成学习随机森林导入数据查看数据信息数据分析随机森林模型预测结果结果分析 个人总结 SVM 超平面&…...
VBA解除Excel工作表保护
Excel工作表保护解除 工作表保护后无法编辑内容,可能是密码忘记,不可暴力破解隐私 1 打开需的Excel 2 Alt F11 打开代码编辑,点击任意代码编辑项,将如下代码复制,并运行。 Public Sub GetWorkbookPassword()Dim w1 A…...
bash: unzip: 未找到命令,sudo: nano:找不到命令
在 Ubuntu/Debian 系统上 打开终端并运行以下命令: sudo apt update sudo apt install unzip在 CentOS/RHEL 系统上 打开终端并运行以下命令: sudo yum install unzip在 macOS 上 如果您使用的是 macOS,可以使用 Homebrew 安装 unzip&#…...
tauri开发配置文件和文件夹访问路径问题
文件夹没权限:Unhandled Promise Rejection: path not allowed on the configured scope: /Users/song/Library/Application Support/com.pakeplus.app/assets/default.png 没有文件夹,需要先创建:Unhandled Promise Rejection: path: /Users…...
【web安全】——信息收集
一、收集域名信息 1.1域名注册信息 工具:站长之家 whois查询 SEO综合查询 1.2子域名收集 原理:字典爆破,通过字典中的各种字符串与主域名拼接,尝试访问。 站长之家 直接查询子域名 ip138.com https://phpinfo.me/domain/ …...
赵长鹏今日获释,下一步会做什么?币安透露2024年加密货币牛市的投资策略!
中国时间2024年9月28日,加密货币行业的风云人物赵长鹏(Changpeng Zhao,简称CZ)终于从监狱获释。他因在担任币安首席执行官期间未能有效执行反洗钱(AML)计划而被判刑四个月。赵长鹏的获释引发了广泛关注,不仅因为他是全…...
SpringMVC之ContextHolder
员工不必为自己的弱点而太多的忧虑,而是要大大地发挥自己的优点,使自己充满自信,以此来解决自己的压抑问题。我自己就有许多地方是弱项,常被家人取笑小学生水平,若我全力以赴去提升那些弱的方面,也许我就做…...
什么是SQL注入?
SQL注入是一种安全漏洞,攻击者通过在应用程序的输入字段中插入恶意SQL代码,从而操控数据库。此类攻击通常利用应用程序未对用户输入进行适当验证和清理的弱点。 工作原理: 输入字段:攻击者在登录表单或搜索框等输入区域插入恶意…...
混合密码系统——用对称密钥提高速度,用公钥密码保护会话密钥
混合密码系统(Hybrid Cryptosystem)是一种结合了多种密码学技术和算法的加密方案,旨在充分利用不同密码算法的优势,以提供更强大的安全性、更高的效率或更好的功能特性。以下是对混合密码系统的详细解释: 组成要素 对…...
Three.js粒子系统与特效
目录 粒子系统基础常见粒子系统特效粒子系统基础 基础的粒子系统 使用THREE.ParticleSystem和THREE.ParticleBasicMaterial实现: // 导入Three.js库 import * as THREE from three...
Tableau数据可视化入门
目录 一、实验名称 二、实验目的 三、实验原理 四、实验环境 五、实验步骤 1、Tableau界面引导 2、数据来源 3、数据预处理操作 4、制作中国各个地区的利润图表 4.1条形图 4.2气泡图 5、制作填充地球图 一、实验名称: 实验一:Tableau数据可视…...
Linux云计算 |【第四阶段】RDBMS1-DAY2
主要内容: 常用函数(函数分类1:单行、分组;函数分类2:字符、数学、日期、流程控制)、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数(Scalar Functions&…...
后台监控中的云边下控耗时、边缘采集耗时 、云边下控量
云边下控耗时:指云端控制边缘设备的时间,从云端下发指令到边缘设备响应完成的时间。该指标反映了云端控制边缘设备的效率和响应速度。 边缘采集耗时:指边缘设备采集数据到云端处理完成的时间,包括数据采集、传输、处理等环节。该…...
【学习笔记】手写 Tomcat 四
目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…...
探索基因奥秘:汇智生物如何利用组蛋白甲基化修饰测序技术革新农业植物基因组研究?
引言: 随着生物医学技术的不断进步,我们对生命奥秘的探索越来越深入。在众多的生物技术中,表观组学分析技术逐渐成为研究的热点。本文将带您走进汇智生物,了解他们如何利用DNA亲和纯化测序技术(DAP-seq)推…...
二叉搜索树的介绍、模拟实现二叉搜索树、leetcode---根据二叉树创建字符串、leetcode---二叉树的最近公共祖先等的介绍
文章目录 前言一、二叉搜索树的介绍二、模拟实现二叉搜索树三、leetcode---根据二叉树创建字符串四、leetcode---二叉树的最近公共祖先总结 前言 二叉搜索树的介绍、模拟实现二叉搜索树、leetcode—根据二叉树创建字符串、leetcode—二叉树的最近公共祖先等的介绍 一、二叉搜索…...
人工智能的基本概念与发展历程
一、人工智能的基本概念与发展历程 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。它涵盖了机器人技术、语言识别、图像识别、自然语言处理和专家系统等众多领域。自20世纪30年代数理逻辑的形式化和智能可计算思想开始构建计…...
【IPV6从入门到起飞】5-6 IPV6+Home Assistant(ESPHome+ESP-cam)实时监控
5-6 IPV6Home Assistant[ESPHomeESP-cam]实时监控 1、背景2、ESPHome 安装2-1 ESPHome 简述2-2 安装 3、创建ESP32-CAM设备4、编辑yaml配置4-1 找到合适的配置4-2 修改配置4-3 验证配置4-4 编译项目 5、烧录固件6、绑定设备7、效果实现 1、背景 在前面我们已经实现了数据采集与…...
生成式AI的未来
随着生成式AI技术的不断进步,关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统(Chat)中展现智慧,还是在自主代理(Agent)中体现能力?这一问题不仅涉及技术实现的可能性&…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
