使用Jackson进行对象序列化时,默认会输出值为null的字段。
很多时候,序列化null字段是没有意义的。如果想忽略null字段,一起来看看Jackson提供的几种方法。
本篇内容基于Jackson 2.11.2版本,马上开始学习吧。
默认序列化null字段
首先,看看默认情况下,默认序列化null字段的情况。
public class Animal {
private String name;
private int sex;
private Integer weight;
// 省略getter、setter方法
@Override
public String toString() {
return "Animal [name=" + name + ", sex=" + sex + ", weight=" + weight + "]";
}
}
/**
* 默认会输出null字段
*
* @throws JsonProcessingException
*/
@Test
public void outputNull() throws JsonProcessingException {
Animal animal = new Animal();
animal.setName("sam");
animal.setSex(1);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(animal));
}
执行结果:
{"name":"sam","sex":1,"weight":null}
由于weight字段没有设置,默认序列化输出null值。
全局忽略值为null的字段
调用ObjectMapper的setSerializationInclusion方法,将序列化包含规则设置为JsonInclude.Include.NON_NULL。
JsonInclude.Include.NON_NULL,表示序列化时不包含值为null的字段。
基于ObjectMapper的设置,都是全局性的。也就是说,只要使用了该ObjectMapper的操作,都会受其设置的影响。
/**
* 全局忽略值为null的字段
*
* @throws JsonProcessingException
*/
@Test
public void nonNullForGlobal() throws JsonProcessingException {
Animal animal = new Animal();
animal.setName("sam");
animal.setSex(1);
ObjectMapper mapper = new ObjectMapper();
// 指定序列化时的包含规则,NON_NULL表示序列化时忽略值为null的字段
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(mapper.writeValueAsString(animal));
}
执行结果:
{"name":"sam","sex":1}
类范围忽略值为null的字段
Jackson提供了一个注解@JsonInclude,可以用来忽略某个类的null字段。
@JsonInclude(JsonInclude.Include.NON_NULL) // 序列化时忽略所有值为null的字段
public class Animal2NonNull {
private String name;
private int sex;
private Integer weight;
// 省略getter、setter方法
}
/**
* 类范围忽略值为null的字段.<br>
* 为类添加@JsonInclude(JsonInclude.Include.NON_NULL)注解,值为null的所有字段都不做序列化
*
* @throws JsonProcessingException
*/
@Test
public void nonNullClassFieldsAnnotation() throws JsonProcessingException {
Animal2NonNull animal = new Animal2NonNull();
animal.setSex(26);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(animal)); // 不输出name和weight
}
执行结果:
{"sex":26}
忽略值为null的某个字段
@JsonInclude注解还可以作用于某个具体的字段,用来忽略指定的字段。
public class Animal2NonNull {
private String name;
private int sex;
@JsonInclude(JsonInclude.Include.NON_NULL) // 如果字段值为null,则不进行序列化
private Integer weight;
// 省略getter、setter方法
}
/**
* 忽略值为null的某个字段.<br>
* 为字段添加@JsonInclude(JsonInclude.Include.NON_NULL)注解,字段值为null时不做序列化
*
* @throws JsonProcessingException
*/
@Test
public void nonNullFieldAnnotation() throws JsonProcessingException {
Animal2NonNull animal = new Animal2NonNull();
animal.setSex(26);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(animal)); // 不输出weight
}
执行结果:
{"name":null,"sex":26}
小结
使用Jackson进行对象序列化时,默认会输出值为null的字段。
本文总结了3种用于忽略null字段的方法,分别对应于全局、类和字段3种范围。
1.全局忽略值为null的字段; 2.类范围忽略值为null的字段; 3.忽略值为null的某个字段。
参考
https://github.com/FasterXML/jackson-databind/ (opens in a new tab)