JSON.stringify()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die JSON.stringify() statische Methode konvertiert einen JavaScript-Wert in einen JSON-String. Dabei können optional Werte ersetzt werden, falls eine Ersetzungsfunktion angegeben wird, oder es können nur die angegebenen Eigenschaften einbezogen werden, falls ein Ersetzungsarray spezifiziert wird.

Probieren Sie es aus

console.log(JSON.stringify({ x: 5, y: 6 }));
// Expected output: '{"x":5,"y":6}'

console.log(
  JSON.stringify([new Number(3), new String("false"), new Boolean(false)]),
);
// Expected output: '[3,"false",false]'

console.log(JSON.stringify({ x: [10, undefined, function () {}, Symbol("")] }));
// Expected output: '{"x":[10,null,null,null]}'

console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// Expected output: '"2006-01-02T15:04:05.000Z"'

Syntax

js
JSON.stringify(value)
JSON.stringify(value, replacer)
JSON.stringify(value, replacer, space)

Parameter

value

Der zu konvertierende Wert in einen JSON-String.

replacer Optional

Eine Funktion, die das Verhalten des Stringifizierungsprozesses verändert, oder ein Array aus Zeichenfolgen und Zahlen, das die Eigenschaften von value spezifiziert, die in der Ausgabe enthalten sein sollen. Wenn replacer ein Array ist, werden alle Elemente in diesem Array, die keine Zeichenfolgen oder Zahlen sind (entweder primitive oder Wrapper-Objekte), einschließlich Symbol-Werte, komplett ignoriert. Wenn replacer etwas anderes als eine Funktion oder ein Array ist (z.B. null oder nicht bereitgestellt), werden alle string-bezogenen Eigenschaften des Objekts im resultierenden JSON-String enthalten.

space Optional

Eine Zeichenfolge oder Zahl, die verwendet wird, um Leerzeichen (einschließlich Einrückungen, Zeilenumbrüche etc.) in den ausgegebenen JSON-String einzufügen, um die Lesbarkeit zu erhöhen.

Ist dies eine Zahl, gibt sie die Anzahl der Leerzeichen an, die als Einrückung verwendet werden sollen, begrenzt auf 10 (das heißt, jede Zahl größer als 10 wird behandelt, als wäre sie 10). Werte kleiner als 1 bedeuten, dass kein Leerzeichen verwendet werden soll.

Ist dies eine Zeichenfolge, wird die Zeichenfolge (oder die ersten 10 Zeichen der Zeichenfolge, wenn sie länger ist) vor jedem verschachtelten Objekt oder Array eingefügt.

Wenn space etwas anderes als eine Zeichenfolge oder Zahl ist (kann entweder ein Primitiv oder ein Wrapper-Objekt sein) — z.B. null oder nicht bereitgestellt — werden keine Leerzeichen verwendet.

Rückgabewert

Ein JSON-String, der den gegebenen Wert darstellt, oder undefined.

Ausnahmen

TypeError

Wird in einem der folgenden Fälle ausgelöst:

  • value enthält eine zirkuläre Referenz.
  • Ein BigInt-Wert wird angetroffen.

Beschreibung

JSON.stringify() konvertiert einen Wert in die JSON-Notation, die den Wert darstellt. Werte werden auf folgende Weise stringifiziert:

  • Boolean, Number, String und BigInt (erreichbar über Object()) Objekte werden während des Stringifizierens in die entsprechenden primitiven Werte konvertiert, gemäß der traditionellen Konvertierungssemantik. Symbol-Objekte (erreichbar über Object()) werden als einfache Objekte behandelt.

  • Der Versuch, BigInt-Werte zu serialisieren, wird einen Fehler auslösen. Hat das BigInt jedoch eine toJSON()-Methode (durch Monkey Patching: BigInt.prototype.toJSON = ...), kann diese Methode das Serialisierungsergebnis liefern. Diese Einschränkung stellt sicher, dass ein ordnungsgemäßes Serialisierungsverhalten (und sehr wahrscheinlich das zugehörige Deserialisierungsverhalten) immer explizit vom Benutzer bereitgestellt wird.

  • undefined, Function, und Symbol-Werte sind keine gültigen JSON-Werte. Wenn solche Werte während der Konvertierung angetroffen werden, werden sie entweder ausgelassen (wenn sie sich in einem Objekt befinden) oder in null geändert (wenn sie in einem Array gefunden werden). JSON.stringify() kann undefined zurückgeben, wenn "reine" Werte wie JSON.stringify(() => {}) oder JSON.stringify(undefined) übergeben werden.

  • Die Zahlen Infinity und NaN sowie der Wert null werden alle als null betrachtet. (Aber im Gegensatz zu den Werten im vorherigen Punkt werden sie niemals ausgelassen.)

  • Arrays werden als Arrays serialisiert (eingeschlossen in eckige Klammern). Nur Array-Indizes zwischen 0 und length - 1 (einschließlich) werden serialisiert; andere Eigenschaften werden ignoriert.

  • Das spezielle Roh-JSON-Objekt, das mit JSON.rawJSON() erstellt wurde, wird als das rohe JSON-Text serialisiert, das es enthält (durch Zugriff auf seine rawJSON-Eigenschaft).

  • Für andere Objekte:

    • Alle Symbol-Eigenschaften werden komplett ignoriert, auch wenn der replacer Parameter verwendet wird.

    • Wenn der Wert eine toJSON()-Methode hat, ist es verantwortlich zu definieren, welche Daten serialisiert werden. Anstelle des Objekts wird der Wert serialisiert, der von der toJSON()-Methode zurückgegeben wird, wenn sie aufgerufen wird. JSON.stringify() ruft toJSON mit einem Parameter auf, dem key, welcher dieselben Semantiken wie der key-Parameter der replacer-Funktion hat:

      • Wenn dieses Objekt ein Eigenschaftswert ist, der Eigenschaftenname.
      • Wenn es in einem Array ist, der Index im Array, als Zeichenfolge.
      • Wenn JSON.stringify() direkt auf diesem Objekt aufgerufen wurde, ein leerer String.

      Alle Temporal-Objekte implementieren die toJSON()-Methode, die eine Zeichenfolge zurückgibt (dieselbe wie ein Aufruf von toString()). Daher werden sie als Zeichenfolgen serialisiert. Ähnlich implementieren Date-Objekte toJSON(), was dasselbe zurückgibt wie toISOString().

    • Es werden nur zählbare eigenen Eigenschaften besucht. Das bedeutet, Map, Set usw. werden zu "{}". Sie können den replacer Parameter verwenden, um sie in etwas Nützlicheres zu serialisieren.

      Eigenschaften werden mit demselben Algorithmus besucht wie Object.keys(), der eine gut definierte Reihenfolge hat und stabil über Implementationen hinweg ist. Zum Beispiel wird JSON.stringify auf demselben Objekt immer denselben String erzeugen, und JSON.parse(JSON.stringify(obj)) würde ein Objekt mit derselben Schlüsselfolge wie das Original erzeugen (vorausgesetzt, dass das Objekt komplett JSON-serialisierbar ist).

Der replacer Parameter

Der replacer Parameter kann entweder eine Funktion oder ein Array sein.

Als Array geben seine Elemente die Namen der Eigenschaften des Objekts an, die im resultierenden JSON-String enthalten sein sollen. Nur Zeichenfolgen und Zahlenwerte werden berücksichtigt; Symbol-Schlüssel werden ignoriert.

Als Funktion nimmt es zwei Parameter: den key und den value, der stringifiziert wird. Das Objekt, in dem der Schlüssel gefunden wurde, wird als this Kontext des replacer bereitgestellt.

Die replacer Funktion wird auch für das initial zu stringifizierende Objekt aufgerufen, in diesem Fall ist der key ein leerer String (""). Sie wird dann für jede Eigenschaft auf dem Objekt oder Array, das stringifiziert wird, aufgerufen. Array-Indizes werden in ihrer Zeichenform als key bereitgestellt. Der aktuelle Eigenschaftswert wird für die Stringifizierung durch den Rückgabewert des replacer ersetzt. Das bedeutet:

  • Wenn Sie eine Zahl, Zeichenfolge, Boolean oder null zurückgeben, wird dieser Wert direkt serialisiert und als Eigenschaftswert verwendet. (Das Zurückgeben eines BigInt wird ebenfalls einen Fehler auslösen.)
  • Wenn Sie eine Function, ein