在开发过程中,对外接口有如下需求:系统提供了一个API接口,对方希望他的接口返回值做一下处理,只返回非空的数据,把空字段过滤一下,我们需要如何做?
比如:
{
"success": true,
"code": 10000,
"message": "操作成功!",
"data": {
"id": null,
"title": "springboot葵花宝典",
"description": "微信公众号",
"published": null
}
}
上面JSON数据published值为null,那么在返回前端的时候我们需要不返回published字段。
这是一种比较常见的需求,我把我常用的处理办法进行总结,供大家参考。
提供的API接口,在返回json数据给用户之前,需要将实体对象转换成json数据。
这就需要使用json转换工具,在Spring框架中默认的JSON序列化框架是Jackson
,这是最常用的Json处理框架,当然除此之外可能小伙伴们也可能会使用fastjson,我们都会进行介绍
1. Jackson去空值
1.1. 局部配置去空值
Jackson 框架中,给我们提供
@JsonInclude
注解,既可以使用在类上面,也可以使用在字段上面,该注解的value值使用Include.NON_NULL
,标记为非空。
- @JsonInclude注解使用在具体字段
@Data
public class Tutorial implements Serializable {
private Long id;
private String title;
private String description;
@JsonInclude(JsonInclude.Include.NON_NULL)
private Integer published;
private static final long serialVersionUID = 1L;
}
Jackson转换成json数据的时候,如果发现published
为空值,就会直接过滤
- @JsonInclude注解使用在具体类
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Tutorial implements Serializable {
// 省略...
}
Jackson转换成json数据的时候,如果发现Tutorial类中只要有字段存在空值,就会直接过滤字段
思考:可能有很多接口有这样的需求,难道我们需要一个个在类上添加该注解?
肯定不是的,我们可以进行Jackson全局配置,统一过滤空字段
1.2. 全局配置去空值
Jackson在Spring Boot中的配置通常较为简单,因为Spring Boot默认使用MappingJackson2HttpMessageConverter作为JSON消息转换器,而不需要特定的配置类。
只需要配置ObjectMapper,可以轻松地实现实现在接口返回值中去掉空字段
/**
* @Author: springboot
* @Github: https://github.com/bangbangzhou
* @description: TODO
*/
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 设置在序列化时不包括值为null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 其他定制配置,根据需要添加
return objectMapper;
}
}
这个配置类使用ObjectMapper来配置Jackson的一些特性,其中setSerializationInclusion(JsonInclude.Include.NON_NULL)
将在序列化时排除掉值为null的字段。
注意:SpringBoot使用HttpMessageConverter接口转换HTTP请求和响应。开箱即用中包含明智的默认设置。
例如,可以将对象自动转换为JSON(通过使用Jackson库)默认情况下,字符串以UTF-8编码。
2.Fastjson去空值
fastjson是阿里开源的高性能JSON序列化框架,虽然fastjson有一些bug,但有些项目还在大量使用。
如果使用的是Fastjson作为JSON序列化库,需要通过配置FastJsonHttpMessageConverter和FastJsonConfig来实现在接口返回值中去掉空字段
@Configuration
public class MyFastjsonConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1、先定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息,比如是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig=new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter=fastConverter;
return new HttpMessageConverters(converter);
}
}