分类
Data Jackson Json

忽略Jackson的空字段

Ignore Null Fields with Jackson

译者注

原文:

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上可以找到本文的示例代码。