给实体类单独设置json序列化策略
废话
最近刚跳槽,接受一个四年前的老项目,太多坑了,sprimgmvc+jsp的老技术,企业内部偏向运维的项目,大部分是jsp页面,没有给统一的前端返回类,没有针对前端用的分页包装类,忍唔住学着写博客记录吐槽下,可能对于其他大神来说,这是些不足挂齿的小问题,但我把坑填好的感觉真的好开心。因为公司的代码拿不回家,所以下面的代码都是测试的东西。
问题背景(还是废话)
被Springmvc中json转换器全局配置坑得好惨。给前端写接口的时候,因为之前没有专门返回给前端用的分页包装类,所以小弟偷懒,直接用了PageHelper的PageInfo对象返回给前端了,结果被前端暴打了一顿,因为查出来集合是空的时候,list字段直接不见了。果断去百度,【pagehelper集合为空时,list字段消失了,而且强行写进一个空List也还是消失】,发现很多人跟我有同一个情况,就以为是PageHelper的锅,然后自己写一个分页包装类吧,集合还是消失了!!!顺藤摸瓜,才发现是springmvc的json转换器问题。
问题
springmvc的配置文件中,设置了json序列化策略是non_null,遇到空值的属性,不序列化,默认应该是always,空不空都全部序列化。
对应springboot的设置:spring. jackson.default-property-inclusion: non_null
解决
然后吧,老项目不敢随便动这个全局配置,怎么办呢?
1、手动用fastjson转成json字符串再返回给前端
JSONObject.toJSONString(testEntity, SerializerFeature.WriteMapNullValue);
我一开始赶进度没时间研究,就用了这个超级笨的办法,这还无意中发现,那全局配置的json转换器,直接用JSONObject.toString,它也生效了,把我的空值字段去掉了,所以还要指定SerializerFeature.WriteMapNullValue,本来返回类型用string就很不爽了,这转换还要拖个这么长的东西,越看越不爽,还影响我要给这个老项目加swagger文档工具的大计。所以下班了赶紧百度百度再百度,终于找到正常人用的方法了。
2、利用@JsonInclude注解
利用@JsonInclude注解可以单独对实体类设置json序列化策略。
@JsonInclude(value = JsonInclude.Include.ALWAYS)
@Data
public class TestEntity {
private String name;
private Integer age;
private Boolean flag;
}
可以选择的策略如下。
public static enum Include {
ALWAYS, //默认
NON_NULL, //属性为NULL不序列化
NON_ABSENT, //
NON_EMPTY, //属性为空字符串或NULL都不序列化
NON_DEFAULT, //属性为默认值不序列化
CUSTOM, //
USE_DEFAULTS; //
}