Spring Boot 接口 JSON 序列化优化:忽略 Null 值的九种解决方案详解
一、针对特定接口null的处理:
方法一:使用 @JsonInclude 注解
1.1 类级别:在接口返回的 DTO 类或字段 上添加 @JsonInclude 注解,强制忽略 null 值:
类级别:所有字段为 null 时不返回
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyResponseDTO {private String field1;
1.2 字段级别:在具体字段上,仅该字段为 null 时不返回
// 字段级别:仅该字段为 null 时不返回
@JsonInclude(JsonInclude.Include.NON_NULL)
private String field2;
1.3 方法级别: 在方法级别使用 @JsonInclude
如果不想在 DTO 类上全局标注 @JsonInclude
,可以直接在 Controller 方法的返回类型上通过 @JsonSerialize
注解临时指定序列化行为。
@GetMapping("/user")
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) // 旧版 Jackson 注解
public MyResponse getUser() {MyResponse response = new MyResponse();response.setName("Alice"); // age 为 null,不返回return response;
}
方法二:动态构建响应对象
在 Controller 方法中手动过滤 null 值,使用 Map 或 JSONObject 动态构建响应体:
@GetMapping("/api")
public Map<String, Object> getData() {MyResponseDTO dto = service.getData();Map<String, Object> result = new HashMap<>();if (dto.getField1() != null) {result.put("field1", dto.getField1());}return result;
}
适用于简单场景,但需手动维护字段映射。
方法三:自定义序列化逻辑(针对复杂场景)
通过继承 JsonSerializer 实现特定字段的 null 处理逻辑,并在 DTO 中指定序列化器:
public class NullSerializer extends JsonSerializer<Object> {@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider provider) {// 忽略 null 字段if (value == null) {return;}gen.writeObject(value);}
}// 在 DTO 字段上指定序列化器
public class MyResponseDTO {@JsonSerialize(using = NullSerializer.class)private String field1;
}
适用于需要精细化控制序列化逻辑的场景。
方法四:自定义 ObjectMapper
并局部使用
通过注入 ObjectMapper
实例,在特定接口中手动序列化数据,跳过 null
值。
@Autowired
private ObjectMapper objectMapper;@GetMapping("/user")
public String getUser(HttpServletResponse response) throws JsonProcessingException {MyResponse data = new MyResponse();data.setName("Alice"); // age 为 null// 临时配置 ObjectMapper 忽略 nullobjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);String json = objectMapper.writeValueAsString(data);// 恢复全局配置(可选)objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);response.setContentType(MediaType.APPLICATION_JSON_VALUE);return json;
}
注意:此方法需手动处理响应,适用于需要完全控制序列化逻辑的场景,但需谨慎管理 ObjectMapper
的线程安全性。
方法五:使用 ResponseBodyAdvice
全局拦截并处理
通过实现 ResponseBodyAdvice
接口,对特定接口或全局返回值进行统一处理。
-
定义切面类
@RestControllerAdvice public class NullIgnoreAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 仅处理特定接口(根据注解、包路径等条件判断)return returnType.getExecutable().getName().equals("getUser");}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType mediaType, Class selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof MyResponse) {// 手动移除 null 值(需根据数据结构处理)((MyResponse) body).setAge(null); // 示例}return body;} }
-
结合
ObjectMapper
动态过滤
在beforeBodyWrite
中重新序列化数据:ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return mapper.convertValue(body, returnType.getParameterType());
二、针对所有接口null 的处理:
2.1 :全局配置(影响所有接口)
若需所有接口忽略null
值,可在application.properties
中配置:
spring.jackson.default-property-inclusion=non_null
2.2 Springboot 整合 fastjson:
在springboot 启动类中定义该方法即可
@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters() {FastJsonHttpMessageConverter4 fastConverter = new FastJsonHttpMessageConverter4();FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.IgnoreNonFieldGetter,SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);fastConverter.setFastJsonConfig(fastJsonConfig);List supportedMediaTypes = new ArrayList();supportedMediaTypes.add(new MediaType("text", "json", Charset.forName("utf8")));supportedMediaTypes.add(new MediaType("application", "json", Charset.forName("utf8")));fastConverter.setSupportedMediaTypes(supportedMediaTypes);HttpMessageConverter<?> converter = fastConverter;return new HttpMessageConverters(converter);}
2.3 Springboot 整合 jackson:
@Configuration
public class JacksonConfig {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {@Overridepublic void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString("");}});return objectMapper;}
}
三、总结:
- 针对新项目,推荐使用全局序列化处理,统一返回值。
- 针对老项目,推荐使用特定接口的处理,避免影响了其他接口的稳定。
相关文章:
Spring Boot 接口 JSON 序列化优化:忽略 Null 值的九种解决方案详解
一、针对特定接口null的处理: 方法一:使用 JsonInclude 注解 1.1 类级别:在接口返回的 DTO 类或字段 上添加 JsonInclude 注解,强制忽略 null 值: 类级别:所有字段为 null 时不返回 JsonInclude(Js…...
Golang 中如何实现一个强大的重试机制,来解决瞬态错误
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
冒泡排序算法优化
一 概述 冒泡排序是一种简单的交换排序算法,其核心思想是通过相邻元素比较和交换将最大元素逐步移动到数组末尾。 二、基础冒泡排序 void bubbleSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if…...
2025年Linux主力系统选择指南:基于最新生态的深度解析(附2025年发行版对比速查表)
Linux发行版生态在2025年持续演进,既有经典系统的迭代升级,也有新兴项目的崛起。本文结合最新行业动态,从个人用户到企业场景,梳理主力系统选择策略,助你找到最适合的Linux发行版。 一、新手友好型:平滑过渡…...
聊聊大数据测试开展方向有哪些?
目录 一、功能性测试与验证 二、数据的更新实时性测试 三、数据响应的及时性测试 四、算法的效果验证 五、AI算法系统的线上稳定性保证 大数据测试实施建议 大数据测试和传统软件测试有什么不同呢?可能涉及数据量大、多样性、处理速度这些特点。然后ÿ…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(11)
详解(11) 初始化配置解析上下文 senv environ;ngx_memzero(&conf, sizeof(ngx_conf_t));/* STUB: init array ? */conf.args ngx_array_create(pool, 10, sizeof(ngx_str_t));if (conf.args NULL) {ngx_destroy_pool(pool);return NULL;}conf.te…...
AI与机器学习、深度学习在气候变化预测中的应用
全球气候变化是现代社会面临的最重要的环境挑战之一,影响了气温、降水、海平面、农业、生态系统等多个方面。气候变化的驱动因素主要包括温室气体排放、气溶胶浓度、火灾频发、海冰融化、叶绿素变化、农业变化和生态环境变化等。这些因素在全球范围内交互作用&#…...
湖仓一体概述
湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…...
Go红队开发—语法补充
文章目录 错误控制使用自定义错误类型错误包装errors.Is 和 errors.Aspanic捕获、recover 、defer错误控制练习 接口结构体实现接口基本类型实现接口切片实现接口 接口练习Embed嵌入文件 之前有师傅问这个系列好像跟红队没啥关系,前几期确实没啥关系,因为…...
【VSCode】VSCode下载安装与配置极简描述
VSCode 参考网址:[Visual Studio Code Guide | GZTime’s Blog]. 下载安装 下载地址:Download Visual Studio Code - Mac, Linux, Windows. 注:推荐不更改安装位置,并且在附加任务中“其他”中的四项全部勾选,即将用…...
揭开人工智能中 Tokens 的神秘面纱
揭开人工智能中 Tokens 的神秘面纱 在人工智能,尤其是自然语言处理(NLP)领域,"tokens" 是一个频繁出现且至关重要的概念。对于理解语言模型如何处理和理解人类语言,tokens 起着基础性的作用。那么ÿ…...
Node.js安装与学习的简单记录
1. 下载与安装 参考: 2024最新版Node.js下载安装及环境配置教程【保姆级】 Node.js中文网 选择长期维护版: 18.19.0,Windows 安装包 (.msi) 64位。 安装选项都默认,安装路径可以改一下。 查看node版本:node -v v18.19.0 查看npm版…...
Spring也能接入Deepseek?
引言 最近DeepSeek可谓风光无限,AI可谓是目前互联网最火热的几个名词,我也一直在关注他的发展,从以前的人工智障,到chatGPT的高不可攀(价格太贵),再到DeepSeek的横空出世,才看到了A…...
STM32 物联网智能家居 (七) 设备子系统--风扇控制
STM32 物联网智能家居 (七) 设备子系统–风扇控制 一、概述 下面我们来讲解设备子系统中的风扇控制,这是我们设备子系统中的最后一章,相信前面大家一家掌握了这种架构分层的编程思想,后续会很容易将程序进行扩展和开发。 上一节我们介绍了OLED屏幕的编程思想,有很多小伙…...
MySQL—Keepalived+MySQL双主复制实现MySQL高可用
Keepalived原理: Keepalived 的原理主要基于虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)、健康检查机制和负载均衡机制,以下为你详细介绍: VRRP 协议实现高可用:VRRP 是 Keep…...
CSS 使用white-space属性换行
一、white-space属性的常见值 * 原本格式: 1、white-space:normal 默认值,空格和换行符会被忽略过滤掉;宽度不够时文本会自动换行 * 宽度足够时,normal 处理后的格式 * 宽度不够时, normal 处理后的格式 2、white-spa…...
【数据结构第十六节】实现链式结构二叉树(详细递归图解—呕心沥血版!)
必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 这节课挺抽象(苦笑),没事,我会帮你!干就完了! (目录在路上) 正文开始—— 引言 用链表…...
mysqldump 参数详解
mysqldump 是一个用于备份 MySQL 数据库的工具。它可以生成一组 SQL 语句,这些语句可以用来重现原始数据库对象定义和表数据。以下是一些常用的 mysqldump 参数及其详细解释: 常用参数 基本参数 --host=host_name, -h host_name: 指定 MySQL 数据库主机地址,默认为 localh…...
Vue-Flow绘制流程图(Vue3+ElementPlus+TS)简单案例
本文是vue3Elementplusts框架编写的简单可拖拽绘制案例。 1.效果图: 2.Index.vue主代码: <script lang"ts" setup> import { ref, markRaw } from "vue"; import {VueFlow,useVueFlow,MarkerType,type Node,type Edge } fro…...
【11】RUST使用cargo组织crate
文章目录 使用cargo组织crate重导出编译文档生成测试 cargo组织工作空间 TODOcrate.io账号 TODO暂时不看发布crate 使用cargo组织crate 重导出 在模块顶部使用pub use self::重导出,方便使用模块时候直接使用use mod_X::xxx。从而隐藏crate内部模块的结构。方便向…...
开放标准(RFC 7519):JSON Web Token (JWT)
开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…...
Linux上用C++和GCC开发程序实现不同MySQL实例下单个Schema之间的稳定高效的数据迁移
设计一个在Linux上运行的GCC C程序,同时连接两个不同的MySQL实例,两个实例中分别有两个Schema的表结构完全相同,复制一个实例中一个Schema里的所有表的数据到另一个实例中一个Schema里,使用以下快速高效的方法,加入异常…...
【Windows】Windows常用命令
目录 文件和目录相关命令系统信息查看命令网络相关命令进程管理命令磁盘管理命令用户和权限管理命令计划任务和脚本命令其他常用命令1. 文件和目录相关命令 命令作用示例cd切换目录cd C:\Usersdir列出目录内容dirmkdir创建新目录mkdir NewFolderrmdir删除空目录rmdir OldFolder…...
趣讲TCP三次握手
一、TCP三次握手简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中,只有两方进行通信,它使用校验和、确认和重传机制来保证数据的可靠传输。…...
vue3中的标签属性中的Ref
用在普通 DOM 标签上,获取的是 DOM 节点: 当你在一个普通的 HTML 标签(例如 <div>、<input> 等)上使用 ref 属性时,ref 会返回该 DOM 元素的直接引用。这使得你可以在 JavaScript 代码中方便地访问和操作…...
vue3.2 + vxe-table4.x 实现多层级结构的 合并、 展开、收起 功能
<template><div style"padding: 20px"><vxe-table border :data"list" :height"800" :span-method"rowspanMethod"><vxe-column title"一级类目" field"category1"><template #defaul…...
DeepSeek R1 + 飞书机器人实现AI智能助手
效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1,项目为sanic和redis实现,利用httpx异步处理流式响应,同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…...
Java虚拟机监控工具
在Java应用高频出现的OOM、卡顿、线程阻塞等问题背后,往往隐藏着复杂的JVM运行机制异常。本文将通过真实案例场景,演示6款主流工具的组合使用技巧,助你快速定位90%以上的线上故障。 一、基础监控三板斧 1. jstat:GC性能透视仪 …...
利用python和gpt写一个conda环境可视化管理工具
最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮…...
软件工程----统一过程模型RUP
统一过程RUP是一种以用例驱动、以体系结构为核心、迭代和增量的软件开发过程,由UML方法和工具支持,广泛应用于各类面向对象项目。 RUP本身支持可裁剪性,可应付给类领域软件和不同的项目规模 RUP蕴含了大量优秀的实践方法,如&…...
Spring的MutipartFile 会直接将流转成文件存放在临时目录嘛?
Spring 的 MultipartFile 默认会将上传的文件存储到临时目录。具体行为取决于底层的 MultipartResolver 实现。常见的实现包括: 1. StandardServletMultipartResolver(默认实现) 如果使用的是 StandardServletMultipartResolver(…...
基于大数据的空气质量数据可视化分析系统
【大数据】基于大数据的空气质量数据可视化分析系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本系统的实践价值在于将大数据技术与空气质量监测相结合,为公众、研究机构和政府…...
一文了解:部署 Deepseek 各版本的硬件要求
很多朋友在咨询关于 DeepSeek 模型部署所需硬件资源的需求,最近自己实践了一部分,部分信息是通过各渠道收集整理,so 仅供参考。 言归正转,大家都知道,DeepSeek 模型的性能在很大程度上取决于它运行的硬件。我们先看一下…...
国内访问Github的四种方法(2025版)
声明:以下内容,仅供学习使用,不得他用。如有他用,与本文作者无关。 国内访问GitHub及下载文件的解决方案整理如下,结合最新技术方案和实测有效方法: 一、网络层解决方案 Hosts文件修改法 通过DNS查询工具…...
企业级AI办公落地实践:基于钉钉/飞书的标准产品解决方案
一、平台化AI的崛起:开箱即用的智能革命 2024年企业AI应用调研数据显示: 73%的中型企业选择平台标准产品而非自研头部SaaS平台AI功能渗透率达89%典型ROI周期从18个月缩短至3-6个月 核心优势对比: 维度自研方案平台标准产品部署周期6-12个…...
金融行业专题|某基金公司基于超融合信创平台支持人大金仓数据库的性能评测
随着“自主可控”在 IT 基础设施领域不断深化,数据库的国产化替代也被很多金融机构提上日程。为了保证性能,大部分国产数据库都基于信创架构的裸金属服务器部署。在国产虚拟化/超融合平台上,国产数据库性能表现如何?尤其是搭配信创…...
Python异常处理面试题及参考答案
目录 什么是 Python 中的异常?程序为什么需要异常处理机制? 解释 BaseException 和 Exception 的区别 Python 的异常处理与传统的错误代码返回机制相比有哪些优势? 列出至少 5 个 Python 内置异常类型并说明触发场景 语法错误 (SyntaxError) 与运行时异常 (Runtime Erro…...
Java 实现快速排序算法:一条快速通道,分而治之
大家好,今天我们来聊聊快速排序(QuickSort)算法,这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法(Divide and Conquer)算法,快速排序的效率在平均情况下非常高ÿ…...
【JavaSE-1】初识Java
1、Java 是什么? Java 是一种优秀的程序设计语言,人类和计算机之间的交流可以借助 Java 这种语言来进行交流,就像人与人之间可以用中文、英语,日语等进行交流一样。 Java 和 JavaScript 两者有关系吗? 一点都没有关系!!! 前端内容:HTML CSS JS,称为网页三剑客 2、JDK 下…...
JavaScript将:;隔开的字符串转换为json格式。使用正则表达式匹配键值对,并构建对象。多用于解析cssText为style Object对象
// 使用正则表达式匹配键值对,并构建对象 let string2Json(s)>{const r {};s.replace(/;/g, ;).replace(/\;/g, \n).replace(/:/g, :).replace(/\n/g, \n)//合并多个换行符.split(\n).forEach(item > {const [k, v] item.split(:);(k…...
lvgl运行机制分析
lv_timer_handler() 是 LVGL 的“心脏”:这个函数会依次做以下事情: 处理定时器(如动画、延迟回调)。 读取输入设备(如触摸屏、按键的状态)。 刷新脏区域(仅重绘屏幕上发生变化的区域…...
紧跟潮流,将 DeepSeek 集成到 VSCode
Visual Studio Code(简称 VSCode)是一款由微软开发的免费开源代码编辑器,自 2015 年发布以来,凭借其轻便、强大、且拥有丰富扩展生态的特点,迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统,包…...
Apache Tomcat RCE 稳定复现 保姆级!(CVE-2024-50379)附视频+POC
原文链接 Apache Tomcat 最新RCE 稳定复现分析 保姆级!!!附复现视频POC 前言 最近爆出 Apache Tomcat条件竞争导致的RCE,影响范围当然是巨大的,公司也及时收到了相关情报,于是老大让我复现,以…...
【文献阅读】A Survey on Model Compression for Large Language Models
大语言模型模型压缩综述 摘要 大语言模型(LLMs)已成功变革了自然语言处理任务。然而,其庞大的规模和高昂的计算需求给实际应用带来了挑战,尤其是在资源受限的环境中。模型压缩已成为应对这些挑战的关键研究领域。本文对大语言模…...
利用shardingsphere-proxy对mysql分片
本文介绍利用shardingsphere-proxy分库分表的配置过程。shardingsphere-proxy是一个中间件,启动后会模拟成一个实际的mysql服务,我们可以通过可视化工具或jdbc操作,实际执行的sql会通过shardingsphere-proxy转换,进而在具体的mysq…...
AI智能体与大语言模型:重塑SaaS系统的未来航向
在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...
mapbox基础,使用geojson加载heatmap热力图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…...
python环境打包2 pytorch和cuda的安装逻辑
基本逻辑 理一理安装pytorch的一列逻辑,以及他的依赖。(看完这小节再实践) 配置pytorch,安装步骤为:显卡驱动-->python-->cuda--->pytorch。 pytorch是依赖conda的,conda是依赖python的。 &am…...
hot100-矩阵
240.搜索二维矩阵② 编写一个高效的算法来搜索 mxn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路: 输入矩阵: 从标准输入读取矩阵的行数 n 和列数 m。 按…...
扩散模型基本概念
1. 核心思想 从最原始的DDPM来讲,扩散模型是用变分估计训练的马尔可夫链,相当于VAE+流模型。与标准化流相比,扩散模型的正向过程为预先定义的加噪过程,负责将图像 x ∼ p ( x ) x\sim{p(x)} x∼...