Einführung in Optionals und Jackson
In der Java-Welt sind Optionals
ein Mittel, um das Vorhandensein oder Fehlen eines Werts auf elegante Weise zu behandeln. Sie wurden mit Java 8 eingeführt und bieten eine bessere Alternative zu null
-Werten. Jackson ist eine beliebte Bibliothek zur Verarbeitung von JSON in Java, die es ermöglicht, Java-Objekte (POJOs) in JSON zu serialisieren und umgekehrt. In modernen Java-Anwendungen werden häufig beide Mittel, Optionals und Jackson, eingesetzt, wobei es gerne zu der im Folgenden beschriebenen Komplikation kommt.
Jacksons Umgang mit Optionals
Ohne spezielle Konfiguration behandelt Jackson Optional
-Attribute wie normale Objekte. Das führt oft zu unerwünschten Ergebnissen bei der Serialisierung.
Codebeispiel – Serialisierung ohne Jdk8Module
public class User {
private Optional<String> name;
// Konstruktoren, Getter und Setter
}
User user = new User(Optional.of("Max"));
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString);
Code-Sprache: JavaScript (javascript)
Ausgabe:
{"name":{"present":true}}
Code-Sprache: JSON / JSON mit Kommentaren (json)
Hier wird das Optional
als reguläres Objekt behandelt, was zu einer nicht intuitiven JSON-Struktur führt.
Einführung des Jdk8Module
Das Jdk8Module
ist ein Modul von Jackson, das speziell für die Arbeit mit Java 8 Features, einschließlich Optional
, entwickelt wurde. Es ermöglicht eine angemessene Behandlung von Optional
-Werten bei der Serialisierung und Deserialisierung. Wie andere Jackson-Module auch muss es explizit „aktiviert“ werden, indem man es beim ObjectMapper registriert.
Registrierung des Jdk8Module
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
Code-Sprache: JavaScript (javascript)
Durch die Registrierung des Jdk8Module
kann Jackson Optional
-Attribute korrekt verarbeiten.
Auswirkung des Jdk8Module auf Serialisierung
Mit dem Jdk8Module
behandelt Jackson Optional
-Attribute so, wie man es intuitiv erwarten würde: Ist der Wert vorhanden, wird er normal serialisiert; ist er nicht vorhanden (Optional.empty()
), wird das Attribut ignoriert oder als null
dargestellt, je nach Konfiguration.
Codebeispiel – Serialisierung mit Jdk8Module
User user = new User(Optional.of("Max"));
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
String jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString);
Code-Sprache: JavaScript (javascript)
Ausgabe:
{"name":"Max"}
Code-Sprache: JSON / JSON mit Kommentaren (json)
Auswirkung des Jdk8Module auf Deserialisierung
Auch bei der Deserialisierung zeigt sich der Nutzen des Jdk8Module
. Jackson kann JSON-Daten korrekt in ein Objekt mit Optional
-Attributen umwandeln, wobei null
-Werte oder fehlende Attribute als Optional.empty()
behandelt werden.
Codebeispiel – Deserialisierung mit Jdk8Module
String jsonString = "{\"name\":\"Max\"}";
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
User user = mapper.readValue(jsonString, User.class);
System.out.println(user.getName());
Code-Sprache: JavaScript (javascript)
Ausgabe:
Optional[Max]
Code-Sprache: CSS (css)
Fazit
Die Integration des Jdk8Module
in Jackson ist unerlässlich, wenn man in Java mit Optional
-Attributen arbeitet. Es sorgt für eine intuitivere und korrektere Behandlung von Optional
-Werten bei der Serialisierung und Deserialisierung, was zu einem klareren, wartungsfreundlicheren Code führt.