Menu

JSON in JavaScript: JSON.stringify & JSON.parse

JavaScript-Objekte in JSON umwandeln und wieder zurück – mit JSON.stringify, JSON.parse, den Hooks replacer und reviver sowie allen Stolperfallen, die beim Round-Trip auffallen.

JSON ist Text – kein JavaScript-Objekt

JSON (JavaScript Object Notation) ist ein Textformat für den Datenaustausch. Es sieht zwar aus wie ein JavaScript-Objektliteral, ist aber tatsächlich ein String – also eine Zeichenkette, die du übers Netzwerk verschicken, in eine Datei speichern oder in eine Konfiguration einfügen kannst.

// Ein JavaScript-Objekt – ein lebendiger Wert im Speicher.
const user = { name: "Rosa", age: 30 };

// JSON – eine Zeichenkette, die dieselben Daten darstellt.
const json = '{"name":"Rosa","age":30}';

Die beiden werden gerne verwechselt, weil sie sich so ähnlich sehen. Als Eselsbrücke hilft folgendes Bild: Objekte leben in deinem Programm; JSON ist das, was sie anziehen, wenn sie das Haus verlassen. Umgewandelt wird mit zwei Funktionen: JSON.stringify (Objekt → String) und JSON.parse (String → Objekt).

JSON.stringify: JavaScript-Objekt in JSON umwandeln

So machst du aus einem beliebigen JavaScript-Wert seine JSON-Repräsentation:

index.js
Output
Click Run to see the output here.

Das Ergebnis ist ein einzeiliger String ohne Leerzeichen – kompakt und perfekt für die Übertragung über das Netzwerk. Die Prüfung mit typeof bestätigt es: string, kein object.

Zum Debuggen, wenn du's lesbar brauchst, übergibst du einfach zwei zusätzliche Argumente. Das zweite ist ein Replacer (dazu gleich mehr); mit null sagst du „nimm alles mit". Das dritte steuert die Einrückung:

index.js
Output
Click Run to see the output here.

Das ist die übliche Form für Pretty-Printing. Nimm 2 oder 4 Leerzeichen – das entspricht dem, was die meisten Tools ausgeben.

JSON.parse: JSON-String in JavaScript-Objekt umwandeln

Der umgekehrte Weg: Du übergibst einen JSON-String und bekommst einen JavaScript-Wert zurück.

index.js
Output
Click Run to see the output here.

Sobald der String geparst ist, hast du es mit einem ganz normalen JavaScript-Objekt zu tun – Punkt-Notation, eckige Klammern, Array-Methoden, alles funktioniert wie gewohnt.

JSON.parse ist allerdings pingelig. Die folgenden Fälle werfen allesamt einen SyntaxError:

JSON.parse("{name: 'Rosa'}");      // Schlüssel ohne Anführungszeichen, einfache Anführungszeichen
JSON.parse('{"name": "Rosa",}');   // nachgestelltes Komma
JSON.parse("// a comment\n{}");    // Kommentare sind nicht erlaubt
JSON.parse("");                    // leerer String

Wenn die Daten von außerhalb deines Programms kommen — etwa aus einer fetch-Antwort, einer Datei oder einer Nutzereingabe — solltest du JSON.parse immer in ein try/catch packen:

index.js
Output
Click Run to see the output here.

Werte, die den Round Trip nicht überleben

JSON kennt nur sechs Wertetypen: Strings, Zahlen, Booleans, null, Arrays und einfache Objekte. Alles andere aus JavaScript wird beim Umwandeln entweder verworfen, verändert – oder bricht komplett ab.

index.js
Output
Click Run to see the output here.

Was genau passiert:

  • Funktionen und undefined werden stillschweigend aus Objekten entfernt. In Arrays werden sie zu null – in JSON darf es keine Lücken in Arrays geben.
  • Date-Objekte werden über ihre toJSON-Methode zu einem ISO-String serialisiert. Beim Parsen bekommst du allerdings nur den String zurück, kein echtes Date.
  • BigInt wirft einen TypeError. Für JSON-Zahlen gibt es schlicht kein Äquivalent.
  • Map, Set und zirkuläre Referenzen funktionieren ebenfalls nicht out of the box.

Damit Date den Round-Trip überlebt, hilft die Reviver-Funktion von JSON.parse:

index.js
Output
Click Run to see the output here.

Die Reviver-Funktion läuft für jedes Schlüssel-Wert-Paar durch und erlaubt es dir, Werte beim Einlesen direkt zu transformieren.

Der Replacer: Steuern, was serialisiert wird

Mit dem zweiten Argument von JSON.stringify legst du fest, was tatsächlich im Output landet. Übergibst du ein Array von Schlüsseln, werden nur diese übernommen (Whitelist):

index.js
Output
Click Run to see the output here.

Oder du übergibst eine Funktion für beliebige Logik – Felder weglassen, Werte maskieren oder direkt im Vorbeigehen transformieren:

index.js
Output
Click Run to see the output here.

Wenn du undefined zurückgibst, wird der Key komplett entfernt. Jeder andere Rückgabewert ersetzt den ursprünglichen Wert.

Ausgabe anpassen mit toJSON

Besitzt ein Objekt eine toJSON-Methode, ruft JSON.stringify diese automatisch auf und serialisiert stattdessen den Rückgabewert. Genau auf diesem Weg steuert auch Date sein eigenes Ausgabeformat – und du kannst dir denselben Hook zunutze machen:

index.js
Output
Click Run to see the output here.

Super praktisch für Klassen, die nach außen hin immer dieselbe Struktur haben sollen – egal, wer sie gerade serialisiert.

Deep Clone (der alte Trick und die bessere Variante)

Jahrelang war JSON.parse(JSON.stringify(obj)) der Einzeiler, um ein einfaches Objekt tief zu klonen:

index.js
Output
Click Run to see the output here.

Das klappt – solange das Objekt ausschließlich JSON-taugliche Werte enthält. Bei Dates, Maps und Funktionen geht es schief (siehe die Round-Trip-Probleme weiter oben).

Im modernen JavaScript gibt es dafür structuredClone. Damit lassen sich Dates, Maps, Sets, Typed Arrays und sogar zirkuläre Referenzen problemlos klonen:

index.js
Output
Click Run to see the output here.

Greif zu structuredClone, wann immer es geht. Den Trick mit JSON.parse(JSON.stringify(...)) behältst du als Notlösung für schnelle, unkomplizierte Klone einfacher Daten in der Hinterhand.

Ein realistisches Beispiel: Daten per fetch holen und parsen

Am häufigsten begegnet dir JSON im Umgang mit HTTP. fetch parst JSON nicht automatisch für dich — du musst .json() auf dem Response-Objekt aufrufen (was intern nichts anderes macht als JSON.parse auf den Response-Body anzuwenden):

index.js
Output
Click Run to see the output here.

Beim Senden läuft's andersherum: Body mit JSON.stringify serialisieren und den Content-Type-Header setzen.

await fetch("/api/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Rosa", age: 30 }),
});

Diese zwei Muster decken den Großteil dessen ab, was du in der Praxis mit JSON machst.

Weiter geht's: Optional Chaining

Geparstes JSON enthält oft optionale Felder — mal ist user.address.city da, mal nicht, und response.data.items kann genauso gut fehlen. Damit du tief verschachtelte Properties auslesen kannst, ohne dass dir das Skript um die Ohren fliegt, gibt es Optional Chaining (?.) — darum geht's auf der nächsten Seite.

Häufig gestellte Fragen

Worin unterscheiden sich JSON und ein JavaScript-Objekt?

JSON ist ein Textformat – also ein String, der aussieht wie ein JavaScript-Objektliteral, aber strengeren Regeln folgt. Keys müssen in doppelten Anführungszeichen stehen, Strings ebenfalls, und als Werte sind nur Strings, Zahlen, Booleans, null, Arrays und einfache Objekte erlaubt. Ein JavaScript-Objekt dagegen ist ein echter Wert im Speicher und kann Funktionen, undefined, Date-Instanzen und so ziemlich alles andere enthalten.

Wie wandle ich ein JavaScript-Objekt in JSON um?

Mit JSON.stringify(obj). Die Methode läuft das Objekt durch und liefert einen JSON-String zurück. Für eine lesbare Ausgabe mit zwei Leerzeichen Einrückung übergibst du ein drittes Argument: JSON.stringify(obj, null, 2). Funktionen und undefined werden in Objekten komplett weggelassen – in Arrays werden sie stattdessen zu null.

Warum wirft JSON.parse einen Fehler?

JSON.parse ist sehr streng: nachgestellte Kommas, einfache Anführungszeichen, Keys ohne Quotes oder Kommentare führen sofort zu einem SyntaxError. Sobald der String aus einem Netzwerk-Request, einer Datei oder einer Nutzereingabe kommt, solltest du den Aufruf deshalb immer in ein try/catch packen.

Bleiben Date-Objekte bei JSON.stringify erhalten?

Nein. Ein Date wird zu einem ISO-String wie "2026-01-15T10:30:00.000Z". Beim anschließenden JSON.parse bekommst du genau diesen String zurück – kein Date-Objekt. Wenn du wieder ein echtes Date brauchst, kannst du den reviver-Parameter von JSON.parse nutzen und die ISO-Strings dort selbst zurück in Date-Instanzen wandeln.

Lerne mit Coddy zu programmieren

LOS GEHT'S