Jackson - Arbeiten mit Karten und Nullen

1. Übersicht

In diesem kurzen Artikel werden wir uns einen fortgeschritteneren Anwendungsfall der Verwendung von Jackson ansehen - die Arbeit mit Karten , die Nullwerte oder Nullschlüssel enthalten .

2. Ignorieren Sie Nullwerte in einer Karte

Jackson hat eine einfache, aber nützliche Möglichkeit, global zu steuern, was mit Nullwerten passiert, wenn eine Karte serialisiert wird:

ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL);

Jetzt wird jeder Nullwert im Map-Objekt, der über diesen Mapper serialisiert wurde, ignoriert:

@Test public void givenIgnoringNullValuesInMap_whenWritingMapObjectWithNullValue_thenIgnored() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); MyDto dtoObject1 = new MyDto(); Map dtoMap = new HashMap(); dtoMap.put("dtoObject1", dtoObject1); dtoMap.put("dtoObject2", null); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("dtoObject1")); assertThat(dtoMapAsString, not(containsString("dtoObject2"))); }

3. Serialisieren einer Karte mit einem Nullschlüssel

Standardmäßig erlaubt Jackson die Serialisierung einer Karte mit einem Nullschlüssel nicht . Wenn Sie versuchen, eine solche Karte zu schreiben, erhalten Sie die folgende Ausnahme:

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)

Die Bibliothek ist jedoch so flexibel, dass Sie einen benutzerdefinierten Serializer für Nullschlüssel definieren und das Standardverhalten überschreiben können:

class MyDtoNullKeySerializer extends StdSerializer { public MyDtoNullKeySerializer() { this(null); } public MyDtoNullKeySerializer(Class t) { super(t); } @Override public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException { jsonGenerator.writeFieldName(""); } }

Jetzt funktioniert die Map mit dem Nullschlüssel einwandfrei - und der Nullschlüssel wird als leerer String geschrieben:

@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 dtoMap = new HashMap(); dtoMap.put(null, dtoObject); String dtoMapAsString = mapper.writeValueAsString(dtoMap); assertThat(dtoMapAsString, containsString("\"\"")); assertThat(dtoMapAsString, containsString("dtoObjectString")); }

4. Nullfelder ignorieren

Neben Maps bietet Jackson eine Menge Konfiguration und Flexibilität zum Ignorieren / Arbeiten mit Nullfeldern im Allgemeinen. In diesem Tutorial können Sie genau sehen, wie das funktioniert.

5. Schlussfolgerung

Das Serialisieren eines Map-Objekts ist häufig genug, dass wir eine Bibliothek benötigen, die die Nuancen des Serialisierungsprozesses gut handhaben kann. Jackson bietet einige praktische Anpassungsoptionen, mit denen Sie die Ausgabe dieses Serialisierungsprozesses recht gut gestalten können.

Es bietet auch viele solide Möglichkeiten, um mit Sammlungen im allgemeineren Sinne zu arbeiten.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf GitHub - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.