前言
近期正好有個項目,客戶端同學要求所有json字段都必須得給,還必須得初始化。如空String返回""、空Array、Collection返回[]、空Boolean返回false、Object空對象返回{},等等。
空對象這塊確實不好處理,反序列化遇到類型擦除問題,網上找了一大圈基本都沒有一個可靠的解決方案。但是,又不想在代碼硬編碼判斷對象為空時把這個對象初始化,這樣不太優雅。因此,想基于自定義JacksonHttpMessageConverter帶注解的方式來巧妙的實現。廢話不多說,我們上代碼!!
實現方式
先定義一個枚舉類型,表示需要處理的方式
然后定義一個注解,以便當對象為null時,返回自動加上花括號"{}"。
然后自定義JacksonHttpMessageConverter集成MappingJackson2HttpMessageConverter來實現個性化序列化。花括號"{}"的核心實現代碼如下:
最后,在需要加花括號"{}"的字段上加上@JacksonFill(FillTypeEnum.BRACE)主鍵。
日期格式化及時區設置
最終,我們實現效果如下:
結束語
筆者也嘗試過使用fastjson替代jackson的方案,fastjson支持WriteMapNullValue、WriteNullListAsEmpty、WriteNullStringAsEmpty、WriteNullNumberAsZero等。但同樣Object的也需要自己個性化處理,在實體類字段直接初始化也是一種解決辦法,但fastjson在兼容性上跟jackson比會有些問題,如二進制序列號。所以,嘗試了一種新的解決思路。
具體代碼見:https://github.com/daoshenzzg/springboot2.x-example
本系列文章
springboot2.x Jackson自定義序列化,優雅實現String、List、Object返回""、[]、{}