Zum Hauptinhalt springen

JSON

Wozu ein Datenformat?

Zwei Programme wollen Daten austauschen. Das eine ist in Java geschrieben, das andere vielleicht in JavaScript, Python oder C#. Ein Java-Objekt lässt sich aber nicht durch ein Netzwerkkabel schicken — übertragen werden Bytes, und ein Java-Objekt ist keine Folge von Bytes.

Also braucht es eine Vereinbarung, wie man ein Objekt aufschreibt und wie der Empfänger daraus wieder ein Objekt macht. JSON wählt dafür Text — man kann eine JSON-Nachricht lesen, ohne ein Werkzeug zu brauchen. (Es gibt auch binäre Formate, etwa bei gRPC; die sind kleiner und schneller, aber für Menschen unlesbar.) Diese Vereinbarung ist ein Datenformat. Das heute verbreitetste heißt JSON (JavaScript Object Notation).

Java-Objektid = 1firstname = "Anna"im ServerSerialisierungJacksonnur noch Text{"id":1, "firstname": "Anna"}geht durch das NetzwerkDeserialisierungObjektid = 1firstname = "Anna"im ClientDurch die Leitung geht nur Text — Objekte gibt es nur an den beiden EndenDie beiden Programme können sogar in verschiedenen Sprachen geschrieben sein
Zwei Begriffe, die du brauchst

Serialisierung — ein Objekt in Text umwandeln (hinausgehend). Deserialisierung — aus Text wieder ein Objekt bauen (hereinkommend).

In Spring erledigt das eine Bibliothek namens Jackson. Du bindest sie nie selbst ein; sie kommt mit spring-boot-starter-webmvc automatisch mit.

Die Bausteine

JSON kennt genau zwei Strukturen und eine Handvoll Datentypen. Mehr nicht — das ist der Grund für seinen Erfolg.

Das Objekt: geschweifte Klammern

{
"id": 1,
"firstname": "Anna",
"surname": "Schmidt"
}
  • steht in { }
  • enthält Schlüssel-Wert-Paare
  • Schlüssel und Wert werden durch : getrennt
  • Paare werden durch , getrennt
  • der Schlüssel steht immer in doppelten Anführungszeichen

Das Array: eckige Klammern

[
{ "id": 1, "firstname": "Anna", "surname": "Schmidt" },
{ "id": 2, "firstname": "Ben", "surname": "Kaya" }
]
  • steht in [ ]
  • enthält eine geordnete Liste von Werten
  • die Werte werden durch , getrennt
Woran du sofort erkennst, was du bekommen hast

Beginnt die Antwort mit {, ist es ein einzelnes Objekt. Beginnt sie mit [, ist es eine Liste.

Deshalb liefert GET /api/v1/persons/1 etwas mit { und GET /api/v1/persons etwas mit [.

Die Datentypen

TypBeispielAnführungszeichen?
Zeichenkette"Anna"ja
Zahl42, 3.14, -7nein
Wahrheitswerttrue, falsenein
leerer Wertnullnein
Objekt{ "a": 1 }
Array[1, 2, 3]
Die häufigste Fehlerquelle

Zahlen und Wahrheitswerte stehen ohne Anführungszeichen. Sobald du sie in Anführungszeichen setzt, sind es Zeichenketten:

{ "alter": 42 } ← eine Zahl
{ "alter": "42" } ← eine Zeichenkette, die zufällig aus Ziffern besteht

Für ein Programm ist das ein Unterschied: Mit der Zahl kann es rechnen, mit der Zeichenkette nicht.

Verschachtelung

Werte dürfen selbst wieder Objekte oder Arrays sein. So bildet JSON beliebig tiefe Strukturen ab:

{
"id": 7,
"name": "Elektrotechnik Meyer",
"contact": {
"street": "Industriestraße 12",
"postcode": "28199",
"city": "Bremen"
},
"articles": [
{ "aid": 1, "designation": "Kabeltrommel", "price": 24.90 },
{ "aid": 2, "designation": "Schraubendreher", "price": 8.50 }
]
}

Lies es von außen nach innen: Ein Lieferant hat einen Kontakt (Objekt) und mehrere Artikel (Array von Objekten).

Typische Fehler

JSON ist streng. Diese vier Fehler machen alle am Anfang:

FalschRichtigWarum
{ firstname: "Anna" }{ "firstname": "Anna" }Schlüssel müssen in Anführungszeichen
{ 'firstname': 'Anna' }{ "firstname": "Anna" }nur doppelte Anführungszeichen
{ "a": 1, "b": 2, }{ "a": 1, "b": 2 }kein Komma hinter dem letzten Paar
// KommentarJSON kennt keine Kommentare
Was du bei einem Syntaxfehler siehst

Schickst du fehlerhaftes JSON an deinen Webservice, antwortet er mit 400 Bad Request. Der Server konnte die Anfrage nicht lesen — der Fehler liegt beim Client.

Bekommst du stattdessen 500, ist etwas anderes kaputt: Dann hat der Server die Anfrage verstanden und ist erst danach gescheitert.

JSON und Java: wie sie zusammenpassen

Jackson bildet die beiden Welten aufeinander ab. Die Regel ist einfach: Attributname = Schlüsselname.

JavaJSON
Klasse / RecordObjekt { }
Attribut bzw. Record-KomponenteSchlüssel-Wert-Paar
StringZeichenkette
int, long, doubleZahl
booleantrue / false
nullnull
List<T>, Set<T>Array [ ]
Referenz auf ein anderes Objektverschachteltes Objekt

Am Beispiel aus dem Tutorial:

public class Person {
private Long id;
private String firstname;
private String surname;
// Getter und Setter
}

wird zu

{ "id": 1, "firstname": "Anna", "surname": "Schmidt" }

Und ein Record ganz genauso:

public record Greeting(String message, LocalDateTime time) { }
{ "message": "Willkommen!", "time": "2026-08-17T18:23:05.59" }
Woher weiß Jackson die Namen?

Bei einer Klasse liest Jackson die Getter: Aus getFirstname() wird der Schlüssel firstname. Deshalb braucht eine Klasse Getter, damit ihre Werte im JSON auftauchen.

Bei einem Record entfällt das — die Komponentennamen stehen bereits in der Deklaration.

Zwei Fälle, die man leicht verwechselt

[] ← ein leeres Array: „Es gibt eine Liste, sie ist leer."
null ← gar nichts: „Hier ist kein Wert."

Das ist kein Wortspiel, sondern hat praktische Folgen. Fragt ein Client alle Personen ab und es gibt noch keine, lautet die richtige Antwort:

HTTP/1.1 200 OK
Content-Type: application/json

[]

Also Status 200 mit leerem Array — nicht 404 und nicht null. Die Sammlung existiert ja; sie ist nur gerade leer.

JSON lesbar machen

Server liefern JSON meist in einer einzigen langen Zeile, weil das kürzer ist:

{"id":1,"firstname":"Anna","surname":"Schmidt"}

Zum Lesen hilft:

WerkzeugWie
BrowserFirefox und Chrome zeigen JSON automatisch aufbereitet und aufklappbar an
Entwicklerwerkzeuge (F12)Reiter Netzwerk → Anfrage anklicken → Antwort
IDEJSON-Datei öffnen und die Formatierungsfunktion aufrufen
Postmanzeigt Antworten automatisch formatiert
Das hast du gelernt
  • JSON ist ein Textformat, mit dem Programme Daten austauschen.
  • Es kennt zwei Strukturen: Objekt { } und Array [ ].
  • Schlüssel stehen immer in doppelten Anführungszeichen, Zahlen und Wahrheitswerte nie.
  • Kein Komma hinter dem letzten Eintrag, keine Kommentare.
  • Serialisierung = Objekt → Text, Deserialisierung = Text → Objekt. In Spring macht das Jackson.
  • [] heißt „leere Liste", null heißt „kein Wert" — das ist nicht dasselbe.
  • Fehlerhaftes JSON beantwortet der Server mit 400.

Weiterlesen