情景: Java中通常都是模板對象,返回時有可能只用到部分字段,但返回客戶端就顯得很臃腫,好多字段都爲null,這些字段也客戶端也用不到,就須要咱們本身作處理。 這裏是講全局處理,單對象處理能夠使用這個註解:@JsonInclude(JsonInclude.Include.NON_NULL) 一、通常都是在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,會發現兩個方法, //序列化時 一、ObjectMapper setSerializationInclusion(Include incl) //默認 二、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。 總結:仍是要多看源碼啊!