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.