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…...
计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
一、Prometheus架构
Prometheus 云原生十二要素是一套最佳实践和规范,旨在帮助开发人员更好地构建云原生应用 这十二个要素分别是: 单一职责独立部署无状态声明式API服务发现容错处理自适应算法自动化运维响应式编程通信协议服务注册与发现数据持久化一、Prometheus 是什么 Prometheus 是一个…...
火山引擎 DeepSeek R1 API 使用小白教程
一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素: 1)API Key 2)API 地址 3)模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址:账号登录-火山引擎 2、在页面右下角,找到【推理】按钮&#…...
react+vite+pnpm+ts基础项目搭建
1. 项目初始化 pnpm create vitelatest my-react-app --template react-ts cd my-react-app pnpm install2. 核心依赖安装 # 基础依赖 pnpm add react-router-dom tanstack/react-query zustand axios# UI 组件库 (任选其一) pnpm add mui/material emotion/react emotion/st…...
ArcGIS Pro 经纬网添加全解析:从布局到样式优化
在地理信息系统的广阔领域中,地图的精确性与直观性对于数据的呈现和分析起着至关重要的作用。 经纬网,作为地图上不可或缺的元素之一,能够为用户提供准确的地理坐标参考,帮助用户快速定位和理解地理空间数据的分布。 本文将深入…...
新闻研究导刊杂志社《新闻研究导刊》编辑部2024年第23期目录
研究论文 媒介智能化环境下新闻传播面临的风险及应对策略研究 冶玉娜; AI赋能地方政务新媒体智能化转型策略研究——以佛山政务新媒体为例 温秀妍; 新闻传播在社交媒体影响下的流变与发展展望 李晋; 县级融媒体中心生产优质短视频的路径探索 陈政清; 数字游…...
DDoS攻击的介绍和防治
一.DDoS攻击是什么 DDoS攻击:dos是服务器拒绝提供服务的意思,最前面的D是分布式的意思,所以说这个大概可以理解为分布式的机器攻击服务器,占用服务器资源,使得服务器拒绝提供服务的一种攻击手段,虽然原理简…...
UDP透传程序
UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁,适用于 A 和 B 设备无法直接通信的情况。 流程: A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数: B_IP “192.168.1.123” # 设备 B 的…...
深度学习pytorch之简单方法自定义9种卷积即插即用
本文详细解析了 PyTorch 中 torch.nn.Conv2d 的核心参数,通过代码示例演示了如何利用这一基础函数实现多种卷积操作。涵盖的卷积类型包括:标准卷积、逐点卷积(1x1 卷积)、非对称卷积(长宽不等的卷积核)、空…...
TMS320F28P550SJ9学习笔记2:Sysconfig 配置与点亮LED
今日学习使用Sysconfig 对引脚进行配置,并点亮开发板上的LED4 与LED5 我的单片机开发板平台是 LAUNCHXL_F28P55x 我是在上文描述的驱动库C2000ware官方例程example的工程基础之上进行添加功能的 该例程路径如下:D:\C2000Ware_5_04_00_00\driverlib\f28p…...
zRAM内存压缩技术:原理与实践初探
zRAM内存压缩技术:原理与实践指南 1. 技术背景与原理 zRAM是Linux内核中的一项内存压缩技术,于2014年进入Linux 3.14内核主线。它的核心思想是利用CPU压缩算法压缩内存数据,在不增加物理内存的情况下扩展系统有效内存容量。 当系统内存紧张…...
Hive 3.1 在 metastore 运行的 remote threads
Remote threads 是仅当 Hive metastore 作为单独的服务运行是启动,请求需要开启 compactor。 有以下几种: 1. AcidOpenTxnsCounterService 统计当前 open 的事务数 从表 TXNS 中统计状态为 open 的事务。此事务数量可以再 hive metrics 中。 2. Acid…...
大语言模型揭秘:从诞生到智能
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言,还能生成流畅的文本,甚至在对话、翻译、创作等任务中表现出接近人类的智能…...
基于模糊PID控制的供热控制系统设计Simulink仿真
1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系店主代为转换) 换热站干扰因素多导致传统PID控制无法满足控制要求的问题,提出利用…...
宝塔找不到php扩展swoole,服务器编译安装
1. 在php7.4中安装swoole,但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…...
LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
【LetMeFly】1745.分割回文串 IV:动态规划(用III或II能直接秒) 力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,…...
C++发展
目录 编辑C 的发展总结:编辑 1. C 的早期发展(1979-1985) 2. C 标准化过程(1985-1998) 3. C 标准演化(2003-2011) 4. C11(2011年) 5. C14(2014年&a…...
Python:函数,return返回值与形参实参
函数: 如: def login():print("这是登陆函数") login() #调用几次,函数里面的代码就会运行几次,每次调用的时候函数都会从头开始运行 return返回值:函数执行结束后最后给调用着的一个结果 作用:…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
