译者注
原文:
https://www.baeldung.com/jackson-ignore-null-fields
官方Demo:
https://github.com/eugenp/tutorials/tree/master/jackson-simple
1. 前言
在本文中我们将会学习,在序列化一个Java类时,如何通过设置Jackson,来实现忽略空字段。
如果想要获得更深入了解Jackson的其他好玩的用法,请点击Jackson基本教程。
2. 在类中忽略空字段
我们可以使用Jackson在对象的级别上来控制空字段,此时只需要在类上添加注解:
@JsonInclude(Include.NON_NULL)
public class MyDto { ... }
或者在字段层面更细微的控制空字段,这种用法需要把注解加在字段上:
public class MyDto {
@JsonInclude(Include.NON_NULL)
private String stringValue;
private int intValue;
// standard getters and setters
}
现在我们进行测试就会发现,空值确实没有出现在JSON输出中:
@Test
public void givenNullsIgnoredOnClass_whenWritingObjectWithNullField_thenIgnored()
throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
MyDto dtoObject = new MyDto();
String dtoAsString = mapper.writeValueAsString(dtoObject);
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, not(containsString("stringValue")));
}
3. 全局忽略空字段
Jackson还可以通过对象映射表(ObjectMapper)来全局的配置空字段。
mapper.setSerializationInclusion(Include.NON_NULL);
经过以上的配置后,任何对象在通过这个映射表进行序列化时,都会忽略空字段:
@Test
public void givenNullsIgnoredGlobally_whenWritingObjectWithNullField_thenIgnored()
throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
MyDto dtoObject = new MyDto();
String dtoAsString = mapper.writeValueAsString(dtoObject);
assertThat(dtoAsString, containsString("intValue"));
assertThat(dtoAsString, containsString("booleanValue"));
assertThat(dtoAsString, not(containsString("stringValue")));
}
4. 结论
“忽略空字段”是Jackson常见的一个基本配置,通常我们需要更好地控制JSON输出,本文演示了如何通过它来控制类。
此外,还有更多的高级用法,例如“当序列化一个映射时忽略空字段”
在Github上可以找到本文的示例代码。