1. 概述

本教程将介绍如何在使用Jackson序列化Java类时,忽略值为null的字段。

如果你想学习更多关于Jackson 2的知识,请访问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
    }

下面测试值为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. 通过全局配置

Jackson支持在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上获取。