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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot 整合 RocketMQ 收发消息的配置过程

    Springboot 整合 RocketMQ 收发消息的配置过程

    这篇文章主要介绍了Springboot 整合 RocketMQ 收发消息,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 在Java中如何比较两个对象浅析

    在Java中如何比较两个对象浅析

    在工作中我们经常会遇到这样的需求——比较两个对象是否相等,如果不相等的话,取出不相等的字段,这篇文章主要给大家介绍了关于在Java中如何比较两个对象的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java中动态设置JVM参数的方法总结

    Java中动态设置JVM参数的方法总结

    通过动态设置JVM参数,开发者可以更有效地管理资源使用和优化性能,本文将详细阐述如何在Java中动态设置JVM参数,感兴趣的小伙伴可以了解下
    2024-12-12
  • Spring Boot集成Kafka最佳实践与详细代码

    Spring Boot集成Kafka最佳实践与详细代码

    Spring Boot作为Java领域的流行框架,提供了与Kafka的无缝集成,本文将详细介绍如何在Spring Boot项目中优雅地集成Kafka,并通过最佳实践和代码示例详细讲解,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 源码解析JDK 1.8 中的 Map.merge()

    源码解析JDK 1.8 中的 Map.merge()

    这篇文章主要介绍了JDK 1.8 之 Map.merge()的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Java通过百度API实现图片车牌号识别

    Java通过百度API实现图片车牌号识别

    这段时间做项目需要用java程序进行车牌识别,因此尝试做了下这个程序,本代码功能是通过调用百度API实现的,感兴趣的可以了解一下
    2021-06-06
  • 深度思考JDK8中日期类型该如何使用详解

    深度思考JDK8中日期类型该如何使用详解

    这篇文章主要介绍了JDK8中日期类型该如何使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java中BCryptPasswordEncoder密码的加密与验证方式

    java中BCryptPasswordEncoder密码的加密与验证方式

    这篇文章主要介绍了java中BCryptPasswordEncoder密码的加密与验证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java中String与StringBuilder的区别

    java中String与StringBuilder的区别

    本篇文章介绍了,java中String与StringBuilder的区别。需要的朋友参考下
    2013-04-04
  • springboot+vue实现登录功能的最新方法整理

    springboot+vue实现登录功能的最新方法整理

    最近做项目时使用到了springboot+vue实现登录功能的技术,所以下面这篇文章主要给大家介绍了关于springboot+vue实现登录功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论