JSON 序列化优化(实战教程之忽略 Null 值)

一、前置说明

现在已经在本地准备了一个接口,接口路径为/basicInformation/basicInfo。接口的返回值如下:

可以看到,很多多余没有数据的字段返回null值。现在已此为案例演示如何实现JSON 序列化优化,用于忽略null值。

二、针对特定接口null的处理

2.1使用 @JsonInclude(JsonInclude.Include.NON_NULL) 注解

2.1.1 类级别:在接口返回的实体类上添加
@JsonInclude(JsonInclude.Include.NON_NULL) 注解,强制忽略 null 值:

类级别:所有字段为 null 时不返回


测试结果:

2.1.2  字段级别:在具体字段上添加@JsonInclude(JsonInclude.Include.NON_NULL) ,仅该字段为 null 时不返回

字段级别:仅该字段为 null 时不返回

测试结果:

2.2使用@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)

用法同@JsonInclude

 区别如下:

  • 注解位置

    • @JsonInclude 是 Jackson 2.x 中引入的注解,通常用于类或字段级别。

    • @JsonSerialize 是 Jackson 1.x 中引入的注解,主要用于指定自定义序列化器,但也支持通过 include 属性控制字段的包含策略。

  • 使用场景

    • @JsonInclude

      • 更现代,推荐在 Jackson 2.x 及以上版本中使用。

      • 语法更简洁,易于理解和使用。

    • @JsonSerialize

      • 更灵活,可以指定自定义序列化器。

      • 通过 include 属性控制字段的包含策略,但语法相对复杂。

三、针对所有接口null 的处理

3.1 全局配置(影响所有接口)

若需所有接口忽略null值,可在application.properties中配置:

spring:
  jackson:
    default-property-inclusion: non_null #序列化时,不输出null属性

测试结果:

3.2  mvc的全局处理(推荐)

/**
 * mvc的全局处理
 */
@Configuration
public class WebMvcGlobalConfig extends WebMvcConfigurationSupport {

    /**
     * 创建了一个 RequestContextFilter 实例,它是一个用于管理请求上下文信息的过滤器,能够为后续的请求处理提供一些上下文支持,比如获取请求的 URI、参数等信息
     * 注意:此处如果不配置,那么获取ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();对象将为null
     */
    @Bean
    public FilterRegistrationBean<RequestContextFilter> requestContextFilter() {
        RequestContextFilter filter = new RequestContextFilter();
        FilterRegistrationBean<RequestContextFilter> registration = new FilterRegistrationBean<>(filter);
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置最高优先级
        return registration;
    }

    /**
     * 用于配置 Spring MVC 的消息转换器列表
     */
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
    }

    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        ObjectMapper objectMapper = new ObjectMapper();
        //序列化空对象时不会抛出异常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, Boolean.FALSE);
        //设置序列化包含策略为 NON_NULL
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }

}

以下是对这段代码的详细解释:

类定义

  • 使用 @Configuration 注解将这个类定义为一个 Spring 配置类,表示其中包含的是 Spring 容器的配置代码,Spring 容器会根据其中的配置来创建和管理 Bean。

  • 继承 WebMvcConfigurationSupport 类,这个类是 Spring MVC 的基础配置支持类,提供了很多默认的配置和方法,可以通过重写其中的方法来自定义 Spring MVC 的行为。

方法 requestContextFilter

  • 通过 @Bean 注解声明该方法返回的对象是一个 Spring 管理的 Bean,即 RequestContextFilter 类型的过滤器。

  • 创建了一个 RequestContextFilter 实例,它是一个用于管理请求上下文信息的过滤器,能够为后续的请求处理提供一些上下文支持,比如获取请求的 URI、参数等信息。

  • 创建了一个 FilterRegistrationBean 对象,并将上述过滤器实例设置给它,FilterRegistrationBean 用于在 Spring 容器中注册过滤器。

  • 调用 registration.setOrder(Ordered.HIGHEST_PRECEDENCE) 方法将该过滤器的优先级设置为最高。这意味着在多个过滤器的场景下,这个过滤器会在其他过滤器之前先处理请求。

方法 configureMessageConverters

  • 重写了父类 WebMvcConfigurationSupport 中的 configureMessageConverters 方法,这个方法用于配置 Spring MVC 的消息转换器列表。

  • 调用 super.configureMessageConverters(converters),执行父类的实现,确保默认的消息转换器被添加到转换器列表中,这样可以保证 Spring MVC 的默认消息转换功能正常工作。

  • 调用 converters.add(mappingJackson2HttpMessageConverter()) 方法,将自定义的 MappingJackson2HttpMessageConverter 添加到转换器列表中,以便在处理请求和响应时使用这个自定义的转换器来转换 JSON 数据格式。

方法 mappingJackson2HttpMessageConverter

  • 创建了一个 ObjectMapper 实例,它是 Jackson 库中用于处理 JSON 数据的核心对象,负责将 Java 对象转换为 JSON 数据,以及将 JSON 数据转换为 Java 对象。

  • 调用 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) 方法,将 FAIL_ON_EMPTY_BEANS 特性设置为 false,表示在序列化空对象时不会抛出异常。默认情况下,如果一个 Java 对象没有任何属性(即空对象),Jackson 在序列化时会抛出异常,这里将其关闭,允许序列化空对象。

  • 调用 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL) 方法,设置序列化包含策略为 NON_NULL,即在序列化 Java 对象为 JSON 数据时,只包含非空的字段。这样可以避免在 JSON 响应中出现多余的空字段,使响应数据更加简洁。

  • 创建一个 MappingJackson2HttpMessageConverter 实例,并将上述配置好的 ObjectMapper 设置给它,这样该转换器在处理 JSON 数据的序列化和反序列化时就会使用这些配置。

这个配置类的作用是自定义 Spring MVC 的部分行为,包括添加一个最高优先级的 RequestContextFilter 过滤器来管理请求上下文,以及自定义 JSON 数据的消息转换器,以满足特定的序列化需求。

测试结果: