Start · Sprachen · JavaScript · Referenz · JSON.parse()

JSON.parse()

Methode

<code>JSON.parse()</code> parst einen JSON-String und erzeugt den entsprechenden JavaScript-Wert, optional transformiert durch eine <code>reviver</code>-Funktion.

Kategorie: method-property

Signatur

JSON.parse(text) / JSON.parse(text, reviver)

Beschreibung

Die statische Methode JSON.parse() parst einen JSON-String und konstruiert daraus den JavaScript-Wert oder das JavaScript-Objekt, das durch den String beschrieben wird. Optional kann eine reviver-Funktion übergeben werden, um eine Transformation am resultierenden Objekt vorzunehmen, bevor es zurückgegeben wird.

JSON.parse() parst einen JSON-String gemäß der JSON-Grammatik und wertet den String dann so aus, als wäre er ein JavaScript-Ausdruck. Der einzige Fall, in dem ein JSON-Text einen anderen Wert repräsentiert als der gleichnamige JavaScript-Ausdruck, ist die Behandlung des Schlüssels "__proto__".

Der reviver-Parameter

Wenn ein reviver angegeben ist, wird der beim Parsen berechnete Wert transformiert, bevor er zurückgegeben wird. Genauer gesagt werden der berechnete Wert und alle seine Eigenschaften (in einer Tiefensuche, beginnend mit den am tiefsten verschachtelten Eigenschaften und fortschreitend bis zum ursprünglichen Wert selbst) einzeln durch den reviver geführt.

Der reviver wird mit dem Objekt, das die zu verarbeitende Eigenschaft enthält, als this aufgerufen (es sei denn, Sie definieren den reviver als Arrow-Funktion, in welchem Fall es keine separate this-Bindung gibt) sowie mit zwei Argumenten: key und value, die den Eigenschaftsnamen als String (auch für Arrays) und den Eigenschaftswert repräsentieren. Für primitive Werte wird ein zusätzlicher context-Parameter übergeben, der den Quelltext dieses Wertes enthält. Wenn die reviver-Funktion undefined zurückgibt (oder keinen Wert zurückgibt — zum Beispiel, wenn die Ausführung am Ende der Funktion ankommt), wird die Eigenschaft aus dem Objekt gelöscht. Andernfalls wird die Eigenschaft mit dem Rückgabewert neu definiert. Wenn der reviver nur einige Werte transformiert und andere nicht, achten Sie darauf, alle nicht transformierten Werte unverändert zurückzugeben — andernfalls werden sie aus dem resultierenden Objekt gelöscht.

Ähnlich wie beim replacer-Parameter von JSON.stringify() wird der reviver für Arrays und Objekte zuletzt auf den Wurzelwert angewendet, mit einem leeren String als key und dem Wurzelobjekt als value. Für andere gültige JSON-Werte funktioniert der reviver ähnlich und wird einmal mit einem leeren String als key und dem Wert selbst als value aufgerufen.

Wenn Sie einen anderen Wert aus dem reviver zurückgeben, ersetzt dieser Wert den ursprünglich geparsten Wert vollständig. Dies gilt sogar für den Wurzelwert. Zum Beispiel:

Es gibt keinen generischen Weg, dies zu umgehen. Sie können den Fall, in dem key ein leerer String ist, nicht speziell behandeln, da JSON-Objekte auch Schlüssel enthalten können, die leere Strings sind. Sie müssen sehr genau wissen, welche Art von Transformation für jeden Schlüssel bei der Implementierung des Revivers benötigt wird.

Beachten Sie, dass der reviver ausgeführt wird, nachdem der Wert geparst wurde. Zahlen im JSON-Text wurden also beispielsweise bereits in JavaScript-Zahlen umgewandelt und können dabei an Präzision verlieren. Eine Möglichkeit, große Zahlen ohne Präzisionsverlust zu übertragen, besteht darin, sie als Strings zu serialisieren und sie als BigInts oder andere geeignete Formate mit beliebiger Präzision wiederherzustellen.

Sie können auch die Eigenschaft context.source verwenden, um auf den ursprünglichen JSON-Quelltext zuzugreifen, der den Wert repräsentiert, wie unten gezeigt:

Parameter

Name Typ Default Beschreibung
$text Pflicht string Der als JSON zu parsende String. Siehe das JSON-Objekt für eine Beschreibung der JSON-Syntax.
$reviver Function Falls eine Funktion, gibt sie vor, wie jeder ursprünglich beim Parsen erzeugte Wert transformiert wird, bevor er zurückgegeben wird. Nicht aufrufbare Werte werden ignoriert. Die Funktion wird mit den Argumenten key (der zum Wert gehörende Schlüssel), value (der beim Parsen erzeugte Wert) und optional context (ein Kontextobjekt mit der Eigenschaft source, welches den ursprünglichen JSON-String für diesen Wert enthält; wird nur bei primitiven Werten übergeben) aufgerufen.

Rückgabewert

Typ
Object | Array | string | number | boolean | null
Beschreibung
Das Object, Array, den String, die Zahl, den Boolean oder null-Wert, der dem angegebenen JSON-text entspricht. Wirft einen SyntaxError, wenn der zu parsende String kein gültiges JSON ist.

Beispiele

Verwendung des reviver-Parameters

JSON.parse(
  '{"p": 5}',
  (key, value) =>
    typeof value === "number"
      ? value * 2 // gibt value * 2 für Zahlen zurück
      : value, // gibt alles andere unverändert zurück
);
// { p: 10 }

JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', (key, value) => {
  console.log(key);
  return value;
});
// 1
// 2
// 4
// 6
// 5
// 3
// ""

Verwendung von reviver zusammen mit dem replacer von JSON.stringify()

// Maps werden normalerweise als Objekte ohne Eigenschaften serialisiert.
// Wir können den replacer verwenden, um die zu serialisierenden Einträge festzulegen.
const map = new Map([
  [1, "one"],
  [2, "two"],
  [3, "three"],
]);

const jsonText = JSON.stringify(map, (key, value) =>
  value instanceof Map ? Array.from(value.entries()) : value,
);

console.log(jsonText);
// [[1,"one"],[2,"two"],[3,"three"]]

const map2 = JSON.parse(jsonText, (key, value) =>
  Array.isArray(value) && value.every(Array.isArray) ? new Map(value) : value,
);

console.log(map2);
// Map { 1 => "one", 2 => "two", 3 => "three" }

Rückgabewert des reviver ersetzt den geparsten Wert

const transformedObj = JSON.parse('[1,5,{"s":1}]', (key, value) =>
  typeof value === "object" ? undefined : value,
);

console.log(transformedObj); // undefined

Zugriff auf den ursprünglichen JSON-Quelltext via context.source

const bigJSON = '{"gross_gdp": 12345678901234567890}';
const bigObj = JSON.parse(bigJSON, (key, value, context) => {
  if (key === "gross_gdp") {
    // Ignoriere den Wert, da er bereits an Präzision verloren hat
    return BigInt(context.source);
  }
  return value;
});

Ungültiges JSON – nachgestellte Kommas

JSON.parse("[1, 2, 3, 4, ]");
// SyntaxError: Unexpected token ] in JSON at position 13

JSON.parse('{"foo": 1, }');
// SyntaxError: Unexpected token } in JSON at position 12

// Wichtig · Fallstricke

Wenn JSON.parse einen String erhält, der nicht der JSON-Grammatik entspricht, wird ein SyntaxError geworfen. Arrays und Objekte dürfen in JSON keine nachgestellten Kommas enthalten, und JSON-Strings müssen mit doppelten (nicht einfachen) Anführungszeichen begrenzt sein.

Siehe auch