ジャクソン – 地図とnullの取り扱い
1概要
この簡単な記事では、** Jacksonを使用する、null値またはnullキーを含む
Maps
を使用した、より高度なユースケースを見ていきます。
** 2マップ内のNULL値を無視
**
Jacksonには、Mapがシリアル化されたときにnull値がどうなるかをグローバルに制御する簡単で便利な方法があります。
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON__NULL);
このマッパーを通してシリアライズされたMapオブジェクトのnull値は無視されます。
@Test
public void givenIgnoringNullValuesInMap__whenWritingMapObjectWithNullValue__thenIgnored()
throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON__NULL);
MyDto dtoObject1 = new MyDto();
Map<String, MyDto> dtoMap = new HashMap<String, MyDto>();
dtoMap.put("dtoObject1", dtoObject1);
dtoMap.put("dtoObject2", null);
String dtoMapAsString = mapper.writeValueAsString(dtoMap);
assertThat(dtoMapAsString, containsString("dtoObject1"));
assertThat(dtoMapAsString, not(containsString("dtoObject2")));
}
3ヌルキーでマップをシリアル化する
デフォルトでは、
Jacksonはnullキーを持つMapのシリアル化を許可していません
。そのような地図を書き出そうとすると、次の例外が発生します。
c.f.j.c.JsonGenerationException:
Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
at c.f.j.d.s.i.FailingSerializer.serialize(FailingSerializer.java:36)
ただし、このライブラリは十分に柔軟で、カスタムのnullキーシリアライザ** を定義してデフォルトの動作をオーバーライドすることができます。
class MyDtoNullKeySerializer extends StdSerializer<Object> {
public MyDtoNullKeySerializer() {
this(null);
}
public MyDtoNullKeySerializer(Class<Object> t) {
super(t);
}
@Override
public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused)
throws IOException, JsonProcessingException {
jsonGenerator.writeFieldName("");
}
}
nullキーを持つMapは正常に動作します。そしてnullキーは空の文字列として書き込まれます。
@Test
public void givenAllowingMapObjectWithNullKey__whenWriting__thenCorrect()
throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializerProvider().setNullKeySerializer(new MyDtoNullKeySerializer());
MyDto dtoObject = new MyDto();
dtoObject.setStringValue("dtoObjectString");
Map<String, MyDto> dtoMap = new HashMap<String, MyDto>();
dtoMap.put(null, dtoObject);
String dtoMapAsString = mapper.writeValueAsString(dtoMap);
assertThat(dtoMapAsString, containsString("\"\""));
assertThat(dtoMapAsString, containsString("dtoObjectString"));
}
4 NULLフィールドを無視
Maps以外にも、Jacksonは
null
フィールドを無視する/一般に扱うための多くの設定と柔軟性を提供します。リンク:/jackson-ignore-null-fields[このチュートリアル]をチェックして、それがどのように機能するかを正確に確認することができます。
5結論
Mapオブジェクトをシリアライズするのは十分に一般的なので、シリアライゼーションプロセスの微妙な部分をうまく処理できるライブラリが必要です。 Jacksonは、このシリアル化プロセスの出力を非常にうまく形作るのに役立つ、いくつかの便利なカスタマイズオプションを提供しています。
それはまたより一般的な意味で
コレクションを扱うための確かな方法の多く
を提供します。
これらすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/jackson#readme[GitHubへの追加]** にあります。インポートしてそのまま実行するのは簡単なはずです。