文
章
目
录
章
目
录
在使用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 {
//省略....
}
由此可见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字段怎么办的解决办法,希望对你有帮助。