Overview
Dieses Tutorial konzentriert sich auf das Verständnis der Jackson ObjectMapper Klasse und wie Java-Objekte in JSON serialisieren und JSON-String in Java-Objekte deserialisieren.
Um mehr über die Jackson-Bibliothek im Allgemeinen zu erfahren, ist das Jackson-Tutorial ein guter Anfang.,
Weitere Informationen:
Vererbung mit Jackson
Jackson JSON Views
Jackson Benutzerdefinierte Serializer
Abhängigkeiten
Fügen wir dem pom zuerst die folgenden Abhängigkeiten hinzu.xml:
Diese Abhängigkeit fügt dem Klassenpfad auch transitiv die folgenden Bibliotheken hinzu:
- jackson-annotations
- jackson-core
Verwenden Sie immer die neuesten Versionen aus dem zentralen Maven-Repository für jackson-databind.
Lesen und Schreiben Mit ObjectMapper
beginnen wir mit den grundlegenden lese-und Schreibvorgänge.,
Die einfache readValue API des ObjectMapper ist ein guter Einstieg. Wir können es verwenden, um JSON-Inhalte in ein Java-Objekt zu analysieren oder zu deserialisieren.
Auf der Schreibseite können wir auch die writeValue-API verwenden, um jedes Java-Objekt als JSON-Ausgabe zu serialisieren.
Wir verwenden die folgende Car-Klasse mit zwei Feldern als Objekt zum Serialisieren oder Deserialisieren in diesem Artikel:
public class Car { private String color; private String type; // standard getters setters}
3.1., Java-Objekt zu JSON
Sehen wir uns ein erstes Beispiel für die Serialisierung eines Java-Objekts in JSON mit der writeValue-Methode der ObjectMapper-Klasse an:
Die Ausgabe des obigen in der Datei lautet:
{"color":"yellow","type":"renault"}
Die Methoden writeValueAsString und writeValueAsBytes der ObjectMapper-Klasse generieren einen JSON aus einem Java-Objekt und geben den generierten JSON als String oder als Byte-Array zurück:
String carAsString = objectMapper.writeValueAsString(car);
3.2., JSON to Java Object
Unten finden Sie ein einfaches Beispiel für die Konvertierung einer JSON-Zeichenfolge in ein Java-Objekt mithilfe der ObjectMapper-Klasse:
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";Car car = objectMapper.readValue(json, Car.class);
Die Funktion readValue() akzeptiert auch andere Eingabeformen, z. B. eine Datei mit JSON-Zeichenfolge:
Car car = objectMapper.readValue(new File("src/test/resources/json_car.json"), Car.class);
oder eine URL:
Car car = objectMapper.readValue(new URL("file:src/test/resources/json_car.json"), Car.class);
3.3. JSON zu Jackson JsonNode
Alternativ kann ein JSON in ein JsonNode-Objekt analysiert und zum Abrufen von Daten von einem bestimmten Knoten verwendet werden:
3.4., Erstellen einer Java-Liste aus einer JSON-Array-Zeichenfolge
Wir können einen JSON in Form eines Arrays mit einer TypeReference in eine Java-Objektliste parsen:
3.5. Erstellen einer Java-Map aus der JSON-Zeichenfolge
Ebenso können wir einen JSON in eine Java-Map analysieren:
Erweiterte Funktionen
Eine der größten Stärken der Jackson-Bibliothek ist der hochgradig anpassbare Serialisierungs-und Deserialisierungsprozess.,
In diesem Abschnitt werden einige erweiterte Funktionen beschrieben, bei denen sich die Eingabe-oder Ausgabe-JSON-Antwort von dem Objekt unterscheiden kann, das die Antwort generiert oder verbraucht.
4.1., Konfigurieren der Serialisierungs-oder Deserialisierungsfunktion
Beim Konvertieren von JSON-Objekten in Java-Klassen führt der Standardprozess zu einer Ausnahme:
String jsonString = "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";
Die JSON-Zeichenfolge im obigen Beispiel im Standard-Parsing-Prozess für das Java-Objekt für die Klasse Auto wird in der UnrecognizedPropertyException Ausnahme führen.,
Über die configure-Methode können wir den Standardprozess erweitern, um die neuen Felder zu ignorieren:
Eine weitere Option basiert auf den FAIL_ON_NULL_FOR_PRIMITIVES, die definiert, ob die Nullwerte für primitive Werte zulässig sind:
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
Ebenso steuert FAIL_ON_NUMBERS_FOR_ENUM, ob Enum-Werte serialisiert werden dürfen/deserialisiert als Zahlen:
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);
Die umfassende Liste der Serialisierungs-und Deserialisierungsfunktionen finden Sie auf der offiziellen Website.
4.2., Erstellen eines benutzerdefinierten Serialisierers oder Deserialisierers
Ein weiteres wesentliches Merkmal der ObjectMapper-Klasse ist die Möglichkeit, einen benutzerdefinierten Serialisierer und Deserialisierer zu registrieren.
Benutzerdefinierte Serialisierer und Deserialisierer sind sehr nützlich in Situationen, in denen sich die Eingabe-oder Ausgabe-JSON-Antwort in ihrer Struktur von der Java-Klasse unterscheidet, in die sie serialisiert oder deserialisiert werden muss.,
Unten finden Sie ein Beispiel für einen benutzerdefinierten JSON-Serialisierer:
Dieser benutzerdefinierte Serialisierer kann folgendermaßen aufgerufen werden:
So sieht das Auto (als JSON-Ausgabe) auf der Clientseite aus:
var carJson = {"car_brand":"renault"}
Und hier ist ein Beispiel für einen benutzerdefinierten JSON-Deserialisierer:
Dieser benutzerdefinierte Deserialisierer kann auf diese Weise aufgerufen werden:
4.3. Umgang mit Datumsformaten
Die Standardserialisierung von Java.util.Datum erzeugt eine Zahl, ich.,e., Epoche Zeitstempel (Anzahl der Millisekunden seit dem 1. Januar 1970, UTC). Dies ist jedoch nicht sehr menschenlesbar und erfordert eine weitere Konvertierung, um in einem menschenlesbaren Format angezeigt zu werden.
Wickeln wir die bisher verwendete Car-Instanz in die Request-Klasse mit der datePurchased-Eigenschaft ein:
public class Request { private Car car; private Date datePurchased; // standard getters setters}
Um das Zeichenfolgenformat eines Datums zu steuern und es z. B. auf yyyy-MM-dd HH:mm a z festzulegen, beachten Sie das folgende Snippet:
Um mehr über die Serialisierung von Daten mit Jackson zu erfahren, lesen Sie mehr in-tiefe Abschreibung.
4.4., Umgang mit Sammlungen
Eine weitere kleine, aber nützliche Funktion, die über die DeserializationFeature-Klasse verfügbar ist, ist die Möglichkeit, den gewünschten Sammlungstyp aus einer JSON-Array-Antwort zu generieren.
Zum Beispiel können wir das Ergebnis als Array generieren:
Oder als Liste:
Weitere Informationen zum Umgang mit Sammlungen mit Jackson finden Sie hier.
Jackson ist eine solide und ausgereifte JSON-Serialisierungs – /Deserialisierungsbibliothek für Java., Die ObjectMapper-API bietet eine einfache Möglichkeit, JSON-Antwortobjekte mit viel Flexibilität zu analysieren und zu generieren. In diesem Artikel wurden die Hauptmerkmale besprochen, die die Bibliothek so beliebt machen.