ジャクソンでヌルフィールドを無視する
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プロジェクトにあります。