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.