1. 概述
本文教大家在使用 Jackson 序列化 Java 类时,如何忽略值为 null
的字段。
如果你想学习更多关于 Jackson 2 的知识,请访问Jackson 系列教程。
2. 使用注解的方式
方法一,使用Jackson提供的 @JsonInclude
注解:
@JsonInclude(Include.NON_NULL)
public class MyDto { ... }
上面会将该类下所有值为null
的字段都忽略掉,如需更细的控制,我们也可以只应用在某个字段上面:
public class MyDto {
@JsonInclude(Include.NON_NULL)
private String stringValue;
private int intValue;
// standard getters and setters
}
下面是测试用例,检测值为null
的字段是否会被输出:
@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. 通过全局配置
方法二,我们可以直接在 ObjectMapper
上配置序列化行为:
mapper.setSerializationInclusion(Include.NON_NULL);
然后,任何使用此mapper序列化的对象,都将忽略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. 总结
忽略null
字段是一种常见的Jackson配置,因为我们需要更好地控制JSON输出。本文介绍了如何对类进行此操作。此外还有更高级的用例,例如在序列化Map时忽略null值。
本文中所有示例源码和代码片段,可从GitHub上获取。