Jackson教程
忽略null字段的3种方法

使用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)