前言
近期正好有個項目,客戶端同學(xué)要求所有json字段都必須得給,還必須得初始化。如空String返回""、空Array、Collection返回[]、空Boolean返回false、Object空對象返回{},等等。
空對象這塊確實不好處理,反序列化遇到類型擦除問題,網(wǎng)上找了一大圈基本都沒有一個可靠的解決方案。但是,又不想在代碼硬編碼判斷對象為空時把這個對象初始化,這樣不太優(yōu)雅。因此,想基于自定義JacksonHttpMessageConverter帶注解的方式來巧妙的實現(xiàn)。廢話不多說,我們上代碼??!
實現(xiàn)方式
先定義一個枚舉類型,表示需要處理的方式

然后定義一個注解,以便當(dāng)對象為null時,返回自動加上花括號"{}"。

然后自定義JacksonHttpMessageConverter集成MappingJackson2HttpMessageConverter來實現(xiàn)個性化序列化。花括號"{}"的核心實現(xiàn)代碼如下:

最后,在需要加花括號"{}"的字段上加上@JacksonFill(FillTypeEnum.BRACE)主鍵。

日期格式化及時區(qū)設(shè)置

最終,我們實現(xiàn)效果如下:

結(jié)束語
筆者也嘗試過使用fastjson替代jackson的方案,fastjson支持WriteMapNullValue、WriteNullListAsEmpty、WriteNullStringAsEmpty、WriteNullNumberAsZero等。但同樣Object的也需要自己個性化處理,在實體類字段直接初始化也是一種解決辦法,但fastjson在兼容性上跟jackson比會有些問題,如二進(jìn)制序列號。所以,嘗試了一種新的解決思路。
具體代碼見:https://github.com/daoshenzzg/springboot2.x-example
本系列文章
springboot2.x Jackson自定義序列化,優(yōu)雅實現(xiàn)String、List、Object返回""、[]、{}
springboot2.x 集成 Mybatis plus(多數(shù)據(jù)源),提升20%的開發(fā)效率