前言
近期正好有个项目,客户端同学要求所有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返回""、[]、{}