«1. Обзор

В этом кратком руководстве рассказывается, как настроить Jackson для игнорирования пустых полей при сериализации класса Java.

Если мы хотим копнуть глубже и узнать другие интересные вещи, связанные с Джексоном 2, мы можем перейти к основному учебнику по Джексону.

2. Игнорировать пустые поля в классе

Джексон позволяет нам контролировать это поведение либо на уровне класса:

@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. Игнорировать пустые поля глобально

Джексон также позволяет нам глобально настроить это поведение в 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. Заключение

Игнорирование пустых полей — это такая распространенная конфигурация Джексона, потому что это часто бывает так, что нам нужно иметь лучший контроль над выводом JSON. В этой статье показано, как это сделать для классов. Однако есть и более продвинутые варианты использования, например игнорирование нулевых значений при сериализации карты.

Реализацию всех этих примеров и фрагментов кода можно найти в проекте Github.