1. 概要

このクイックチュートリアルでは、Javaクラスをシリアル化するときにnullフィールドを無視するようにJacksonを設定する方法について説明します。

ジャクソン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
}

これで、null値が実際に最終的な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);

これで、このマッパーを介してシリアル化されたクラスの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 フィールドを無視することは、JSON出力をより適切に制御する必要がある場合が多いため、このような一般的なJackson構成です。 この記事では、クラスでそれを行う方法を示します。 ただし、Mapをシリアル化するときにnull値を無視するなどのより高度なユースケースがあります。

これらすべての例とコードスニペットの実装は、Githubプロジェクトにあります。