一、前置说明
现在已经在本地准备了一个接口,接口路径为/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*/@Beanpublic FilterRegistrationBean<RequestContextFilter> requestContextFilter() {RequestContextFilter filter = new RequestContextFilter();FilterRegistrationBean<RequestContextFilter> registration = new FilterRegistrationBean<>(filter);registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置最高优先级return registration;}/*** 用于配置 Spring MVC 的消息转换器列表*/@Overrideprotected 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_NULLobjectMapper.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 数据的消息转换器,以满足特定的序列化需求。
测试结果: