jackson序列化忽略属性值为null字段怎么办

后端 潘老师 2个月前 (01-05) 55 ℃ (0) 扫码查看

在使用jackson序列化json对象进行接口通信时,发现当对象中某个属性为null时,会导致在序列化传给接口时默认忽略掉了,我们该怎么处理呢?

现象

我们先看下现象,这里首先是一个请求对象类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DmsDeviceAlarmRequest implements Serializable {
    @JsonIgnore
    private static final long serialVersionUID = -5349497848192665627L;

    private String pointId;
    private String deviceCode;
    private String deviceName;
    private String statusDesc;
    private String alarmLevel;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date beginTime;
}

然后我们的测试传输的对象中deviceName属性值为null,序列化后的json格式如下:

我们发现少了deviceName字段,也就是说为null的属性直接就被忽略掉不进行序列化了。

解决办法

解决办法非常简单,借助jackson的@JsonInclude注解,在原有的请求类上加上@JsonInclude(JsonInclude.Include.ALWAYS)注解即可:

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.ALWAYS)
public class DmsDeviceAlarmRequest implements Serializable {
   //省略....
}

然后再次去测试发现序列化后的json格式如下:

由此可见JsonInclude.Include.ALWAYS可以保证无论属性字段是否为null都会进行序列化。

补充说明

@JsonInclude注解用在实体类或属性上,可配合如下参数使用

  • ALWAYS:表示总是序列化所有属性
  • NON_NULL:表示序列化非null属性
  • NON_ABSENT:表示序列化非null或者引用类型缺省值,例如java8的Optional类,这个选中通常与Optional一起使用
  • NON_EMPTY:表示序列化非Empty的属性,例如空的集合不会被序列化
  • NON_DEFAULT:仅包含与POJO属性默认值不同的值
  • CUSTOM:由{@link JsonInclude#valueFilter}指定值本身,或由{@link JsonInclude#contentFilter}指定结构化类型的内容,由过滤器对象的equals方法进行序列化,返回true则会被排除,返回false会被序列化
  • USE_DEFAULTS:使用默认值

总结

以上就是jackson序列化忽略属性值为null字段怎么办的解决办法,希望对你有帮助。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/12721.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】