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上获取。