SpringBoot配置返回数据不存在null的问题小结

 更新时间:2025年02月11日 10:57:34   作者:用草书谱写兰亭序  
文章介绍了在Spring Boot项目中使用Jackson序列化器处理JSON数据时遇到的问题,特别是如何配置Jackson以返回不包含null值的JSON响应,并探讨了Jackson的三种主要JSON处理方法,感兴趣的朋友一起看看吧

一、引言

最近在做项目中遇到一个神奇的问题,在测试返回银行三级数据的时候有的项目中返回的数据中把null值的数据返回了,而有的时候就不存在null值数据,如下所示:

存在null值情况

不含null值情况

但是我们可以看一下返回的VO的数据结果如下:

import lombok.Data;
import java.util.List;
/*
 * @description 银行
 * @author 罗添煦
 * @create 2024-08-30 下午12:38
 */
@Data
public class BankEntity {
    private String bankName;
    private String bankCode;
    private List<BankEntity> children;
}

二、jackson

        因为上面的问题出现带着好奇心的我,就去搜索了大量的资料,发现在springboot中默认支持的序列化器是jackson,可能你没有听说过jackson这个序列化器,但是你应该在项目中使用过alibaba的序列化工具fastjson。

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 最方便的方式。(常用)

但是这个地方我们就不过多的去介绍使用Jackson我们还是来看一下是如何解决响应数据中不含null值这个问题的。 

三、配置jackson

处理方法1、返回json中的null字段-不显示 

配置文件添加 spring.jackson.default-property-inclusion=non_null 配置

处理方法2、返回json中的null字段-转为空字符串

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
/**
 * 处理 jackson 返回的null值
 * 返回json中的null值转为空字符串
 */
@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>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

但是这种方式只是把返回null的数据返回成为了空字符串,和我们需要的看不到参数还是有差距的。

 jackson其他配置,我们可以配置Jackson返回时间的类型。

我们可以看一下springboot默认帮我们配置的时间类型的返回数据是什么格式。

在不指定任何特殊配置的情况下,返回的 date 类型的字段会自动转成 UTC 格式字符串,形如 "2024-09-02T01:51:24.091+00:00"

但是我们想要变成yyyy-MM-dd HH:mm:ss这种格式的话我们就可以在字段上添加注解

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

 经过配置以后返回数据如下所示:

到此这篇关于SpringBoot配置返回数据不存在null的问题小结的文章就介绍到这了,更多相关SpringBoot返回null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java内存模型详解

    Java内存模型详解

    JMM全称Java Memory Model, 中文翻译Java内存模型,一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,本详细介绍了Java内存模型,感兴趣的同学可以参考一下
    2023-04-04
  • Java实现升级版布谷鸟闯关游戏的示例代码

    Java实现升级版布谷鸟闯关游戏的示例代码

    升级版布谷鸟闯关游戏是一个基于java的布谷鸟闯关游戏,鼠标左键点击控制鸟的位置穿过管道间的缝隙。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-02-02
  • spring boot使用@Async注解解决异步多线程入库的问题

    spring boot使用@Async注解解决异步多线程入库的问题

    最近在写项目是需要添加异步操作来提高效率,所以下面这篇文章主要给大家介绍了关于spring boot使用@Async注解解决异步多线程入库问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • java实现微信小程序登录态维护的示例代码

    java实现微信小程序登录态维护的示例代码

    本篇文章主要介绍了java实现微信小程序登录态维护的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • 总结Junit4,Junit5,Jupiter之间的联系

    总结Junit4,Junit5,Jupiter之间的联系

    Jupiter和Junit5之间有什么联系?Jupiter提供了哪些新的测试方法?如何用IDEA和Jupiter生成可读性更好的测试报告?文中有非常详细的说明,需要的朋友可以参考下
    2021-06-06
  • 详解大数据处理引擎Flink内存管理

    详解大数据处理引擎Flink内存管理

    Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低、full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性。针对频繁序列化和反序列化问题flink使用堆内堆外内存可以直接在一些场景下操作二进制数据,减少序列化反序列化消耗。本文带你详细理解其原理。
    2021-05-05
  • Spring整合MyBatis图示过程解析

    Spring整合MyBatis图示过程解析

    这篇文章主要介绍了Spring整合MyBatis图示过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • spring中定时任务taskScheduler的详细介绍

    spring中定时任务taskScheduler的详细介绍

    这篇文章主要介绍了spring中定时任务taskScheduler的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-02-02
  • Java单链表的简单操作实现教程

    Java单链表的简单操作实现教程

    这篇文章主要给大家介绍了关于Java单链表的简单操作实现教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java File类 mkdir 不能创建多层目录的解决

    Java File类 mkdir 不能创建多层目录的解决

    这篇文章主要介绍了Java File类 mkdir 不能创建多层目录的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论