Java JSON Einführung
Ein Überblick über die wichtigsten JSON-Bibliotheken für Java: Jackson, Gson, JSON-B und org.json.
JSON (JavaScript Object Notation) ist das gebräuchlichste Format für den Datenaustausch im Web. APIs liefern es zurück, Konfigurationsdateien nutzen es, und Dienste reichen es untereinander weiter. Java bringt keine JSON-Unterstützung im Kern-JDK mit, weshalb die Arbeit mit JSON die Wahl einer Bibliothek erfordert — die Konzepte des Parsens, Mappings und Serialisierens bleiben jedoch bei jeder Wahl gleich.
Diese Seite ist die Übersicht für den JSON-Abschnitt: Sie erklärt, was JSON ist, wie seine Typen den Java-Typen entsprechen, welche Bibliotheken es gibt und die zwei Parsing-Modelle. Die nachfolgenden Kapitel gehen tief auf die zwei beliebtesten Bibliotheken ein — JSON mit Jackson und JSON mit Gson.
Was JSON ist
JSON ist ein leichtgewichtiges, textbasiertes Format für strukturierte Daten. Es besteht aus wenigen einfachen Typen: Strings, Zahlen, Booleans, null, Arrays (geordnete Listen) und Objekte (Schlüssel/Wert-Maps). Da es reiner Text ist, kann jede Sprache es lesen und schreiben — deshalb wurde es zur gemeinsamen Sprache der Web-APIs.
{
"name": "Ann",
"age": 30,
"admin": true,
"roles": ["editor", "author"],
"address": null
}Das Format lässt sich sauber auf Programmiersprachen-Typen abbilden. In Java wird ein JSON-Objekt zu einer Map oder einer eigenen Klasse, ein Array zu einer List oder einem Array, und die skalaren Typen werden zu String, Number, Boolean und null.
| JSON-Typ | Java-Äquivalent |
|---|---|
| object | Map<String, Object> oder ein POJO/Record |
| array | List<?> oder T[] |
| string | String |
| number | int, long, double, BigDecimal |
true / false | boolean / Boolean |
null | null |
Warum JSON wichtig ist
JSON ist die Standard-Payload für REST APIs, und Java-Programme senden und empfangen sie ständig: Ein Webdienst liest einen JSON-Anfragekörper, fragt eine Datenbank ab und schreibt eine JSON-Antwort. Es ist außerdem für Menschen lesbar, sodass es gleichzeitig als Konfigurations- und Logging-Format dient.
Im Vergleich zu XML — dem älteren Austauschformat, das JSON weitgehend verdrängt hat — ist JSON knapper, hat weniger Formalismus und bildet sich direkter auf Datenstrukturen von Programmiersprachen ab. XML hat noch die Nase vorn, wenn Schemas, Namespaces oder gemischte Inhalte benötigt werden, aber für den reinen Datenaustausch ist JSON in der Regel die leichtere Wahl.
Die wichtigsten Java-Bibliotheken
Das JDK liefert keinen JSON-Parser mit, daher fügt man einen hinzu. Drei Bibliotheken dominieren:
| Bibliothek | Stärke | Typischer Einsatz |
|---|---|---|
| Jackson | Schnell, funktionsreich, Streaming + Binding | De-facto-Standard; in Spring Boot integriert |
| Gson | Einfache API, kleiner Fußabdruck | Android, schnelle Skripte |
| JSON-P / JSON-B (Jakarta) | Offizieller Jakarta-EE-Standard | Enterprise/Jakarta-Anwendungen |
Jackson ist am weitesten verbreitet. Seine zentrale Klasse ist ObjectMapper, die in einem einzigen Aufruf zwischen JSON-Text und Java-Objekten konvertiert:
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
// Java object -> JSON text (serialize)
String json = mapper.writeValueAsString(user);
// JSON text -> Java object (deserialize)
User parsed = mapper.readValue(json, User.class);Gson folgt dem gleichen Muster mit anderen Namen:
import com.google.gson.Gson;
Gson gson = new Gson();
String json = gson.toJson(user); // serialize
User parsed = gson.fromJson(json, User.class); // deserializeFügen Sie die Bibliothek als Abhängigkeit hinzu, bevor Sie sie verwenden — für Jackson ist das com.fasterxml.jackson.core:jackson-databind; für Gson com.google.code.gson:gson.
Welche sollten Sie wählen? Wenn Sie Spring Boot verwenden, ist Jackson bereits vorhanden und konfiguriert — nutzen Sie es. Für ein kleines eigenständiges Tool oder eine Android-App, bei der die Binärgröße eine Rolle spielt, ist Gsons winzige, konfigurationsfreie API praktisch. Greifen Sie nur dann auf JSON-B zurück, wenn Sie sich zum Jakarta-EE-Stack bekennen und den herstellerneutralen Standard wünschen. In der Praxis spielt die Wahl für die Korrektheit selten eine Rolle — alle drei lesen und schreiben dasselbe JSON —, also bevorzugen Sie diejenige, die bereits auf Ihrem Classpath vorhanden ist.
Zwei Wege zum Parsen: Baum vs. Binding
Unabhängig von der gewählten Bibliothek gibt es zwei Hauptmodelle zum Lesen von JSON:
- Data Binding bildet JSON direkt auf Java-Klassen ab. Sie definieren eine Klasse (oder einen Record), deren Felder den Schlüsseln entsprechen, und die Bibliothek befüllt sie. Dies ist der sauberste Ansatz, wenn die Struktur bekannt und stabil ist.
- Baum-/Map-Modell parst JSON in einen generischen Baum aus Knoten (
JsonNodein Jackson) oder eineMap<String, Object>. Sie navigieren per Schlüssel. Verwenden Sie dies, wenn die Struktur dynamisch ist oder Sie nur wenige Felder benötigen.
// Binding: structure known ahead of time
record User(String name, int age, boolean admin) {}
User u = mapper.readValue(json, User.class);
System.out.println(u.name());
// Tree: navigate without a class
JsonNode root = mapper.readTree(json);
System.out.println(root.get("name").asText());Binding bietet Typsicherheit und lesbaren Code; das Baum-Modell bietet Flexibilität. Die meisten Anwendungen verwenden Binding für ihre eigenen Domänenobjekte und greifen nur für locker strukturierte Daten auf das Baum-Modell zurück.
Ein ausführbares Beispiel
Die Sandbox hat kein Jackson oder Gson auf dem Classpath, daher verwendet das folgende Programm nur JDK-Collections, um dieselbe Idee zu demonstrieren: Ein geparste JSON-Objekt ist nur Schlüssel, die auf typisierte Werte abgebildet werden, ein Array ist eine List, und Serialisierung wandelt diese Struktur wieder in JSON-Text um. Die statischen Beispiele oben zeigen die echte Bibliotheks-API, die Sie in einem Projekt verwenden werden.
Was man aus dem Lauf mitnehmen sollte:
- Ein geparste JSON-Objekt verhält sich wie eine
Map: Sie rufen jedes Feld über seinen Schlüssel ab, genauso wiemapper.readTree(...).get("name")in Jackson. - JSON-Werte behalten ihren Typ —
agekommt alsNumberzurück undadminalsBoolean, nicht als Rohtext, weshalbage instanceof Numbertrueausgibt. - Ein JSON-Array wird zu einer
List, sodassrolesiterierbar ist und eine Größe von2meldet. - Serialisierung ist das Gegenteil von Parsing: Das Durchlaufen derselben Struktur rekonstruiert den kompakten JSON-Text
{"name":"Ann",...}. - Die Verwendung von
LinkedHashMapbewahrt die Einfügereihenfolge, sodass die serialisierten Schlüssel in der Reihenfolge erscheinen, in der sie hinzugefügt wurden — nützlich für stabile, diff-freundliche Ausgabe.