给实体类单独设置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;   //
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值