情景:
Java中一般都是模板对象,返回时有可能只用到部分字段,但返回客户端就显得很臃肿,好多字段都为null,这些字段也客户端也用不到,就需要我们自己做处理。
这里是讲全局处理,单对象处理可以使用这个注解:@JsonInclude(JsonInclude.Include.NON_NULL)
1、一般都是在SpringBoot的yml里面添加这个属性:
spring:
jackson:
default-property-inclusion: non_null
但是这样写有时候会失效,为什么呢,看下面这句话:意思就是说当你使用 @EnableWebMvc 配置类来处理的MVC的时候,会退出Spring Boot默认MVC配置,
你可以使用 WebMvcConfigurationSupport 中的 getMessageConverters 手动执行所有操作。
But!WebMvcConfigurationSupport 他已经过期了,getMessageConverters 它也用不了了,
So,implements WebMvcConfigurer,重写 configureMessageConverters
/**
* @Author : Yanqiang
* @Date : 2019-10-23
* @Description : mvc应用配置
*/
@Configuration
@EnableWebMvc
public class WebAppConfig implements WebMvcConfigurer {
/**
* 添加到消息转换器
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/*super.configureMessageConverters(converters);*/
converters.add(responseBodyConverter());
//添加我们自定义的 HttpMessageConverte
converters.add(jackson2HttpMessageConverter());
}
/**
* 处理返回json格式
* 定义时间格式转换器
* @return MappingJackson2HttpMessageConverter
*/
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//主要是这句处理
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//时间格式化
//mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converter.setObjectMapper(mapper);
return converter;
}
}
解析:
MappingJackson2HttpMessageConverter.setObjectMapper(mapper); 是需要接收一个 ObjectMapper
我们点进去看一下 ObjectMapper 是否能设置 Include,
进入 ObjectMapper 类,搜索 Include,会发现两个方法,
//序列化时
1、ObjectMapper setSerializationInclusion(Include incl)
//默认
2、ObjectMapper setDefaultPropertyInclusion(Include incl)
具体介绍可以看下这个:
https://www.ibm.com/developerworks/cn/java/jackson-advanced-application/index.html?cm_mmc=dwchina-_-homepage-_-social-_-wechat
其他配置还有:
//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)
//在序列化时忽略值为 null 的属性
mapper.setSerializationInclusion(Include.NON_NULL);
//忽略值为默认值的属性
mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);
更多配置信息可以查看 Jackson 的 DeserializationFeature,SerializationFeature 和 Include。
总结:还是要多看源码啊!