前言
近期正好有個(gè)項(xiàng)目,客戶(hù)端同學(xué)要求所有json字段都必須得給募逞,還必須得初始化蛋铆。如空String返回""、空Array放接、Collection返回[]刺啦、空Boolean返回false、Object空對(duì)象返回{}纠脾,等等玛瘸。
空對(duì)象這塊確實(shí)不好處理,反序列化遇到類(lèi)型擦除問(wèn)題苟蹈,網(wǎng)上找了一大圈基本都沒(méi)有一個(gè)可靠的解決方案糊渊。但是,又不想在代碼硬編碼判斷對(duì)象為空時(shí)把這個(gè)對(duì)象初始化慧脱,這樣不太優(yōu)雅渺绒。因此,想基于自定義JacksonHttpMessageConverter帶注解的方式來(lái)巧妙的實(shí)現(xiàn)菱鸥。廢話(huà)不多說(shuō)宗兼,我們上代碼!氮采!
實(shí)現(xiàn)方式
先定義一個(gè)枚舉類(lèi)型殷绍,表示需要處理的方式
然后定義一個(gè)注解,以便當(dāng)對(duì)象為null時(shí)扳抽,返回自動(dòng)加上花括號(hào)"{}"篡帕。
然后自定義JacksonHttpMessageConverter集成MappingJackson2HttpMessageConverter來(lái)實(shí)現(xiàn)個(gè)性化序列化∶衬兀花括號(hào)"{}"的核心實(shí)現(xiàn)代碼如下:
最后,在需要加花括號(hào)"{}"的字段上加上@JacksonFill(FillTypeEnum.BRACE)主鍵拢军。
日期格式化及時(shí)區(qū)設(shè)置
最終楞陷,我們實(shí)現(xiàn)效果如下:
結(jié)束語(yǔ)
筆者也嘗試過(guò)使用fastjson替代jackson的方案,fastjson支持WriteMapNullValue茉唉、WriteNullListAsEmpty固蛾、WriteNullStringAsEmpty结执、WriteNullNumberAsZero等。但同樣Object的也需要自己個(gè)性化處理艾凯,在實(shí)體類(lèi)字段直接初始化也是一種解決辦法献幔,但fastjson在兼容性上跟jackson比會(huì)有些問(wèn)題,如二進(jìn)制序列號(hào)趾诗。所以蜡感,嘗試了一種新的解決思路。
具體代碼見(jiàn):https://github.com/daoshenzzg/springboot2.x-example
本系列文章
springboot2.x Jackson自定義序列化恃泪,優(yōu)雅實(shí)現(xiàn)String郑兴、List、Object返回""贝乎、[]情连、{}
springboot2.x 集成 Mybatis plus(多數(shù)據(jù)源),提升20%的開(kāi)發(fā)效率
springboot2.x 如何優(yōu)雅的實(shí)現(xiàn)API輸出览效?
如何優(yōu)雅的實(shí)現(xiàn)數(shù)據(jù)置頂却舀、置尾、交換锤灿、拖動(dòng)排序禁筏?