Jackson 全局返回值過濾 null 值

情景:
   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 的 DeserializationFeatureSerializationFeatureInclude。



總結:仍是要多看源碼啊!
相關文章
相關標籤/搜索