Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Experiment: Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.

JSON.parse()

BaselineWidely available *

Die statische MethodeJSON.parse() analysiert einen JSON-String und erstellt den JavaScript-Wert oder das JavaScript-Objekt, das durch den String beschrieben wird. Eine optionalereviver-Funktion kann bereitgestellt werden, um eine Transformation des resultierenden Objekts durchzuführen, bevor es zurückgegeben wird.

Probieren Sie es aus

const json = '{"result":true, "count":42}';const obj = JSON.parse(json);console.log(obj.count);// Expected output: 42console.log(obj.result);// Expected output: true

Syntax

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

Parameter

text

Der String, der als JSON geparst werden soll. Siehe dasJSON-Objekt für eine Beschreibung der JSON-Syntax.

reviverOptional

Wenn eine Funktion angegeben ist, definiert diese, wie jeder Wert, der ursprünglich durch das Parsen erzeugt wird, vor der Rückgabe transformiert wird. Nicht aufrufbare Werte werden ignoriert. Die Funktion wird mit den folgenden Argumenten aufgerufen:

key

Der Schlüssel, der dem Wert zugeordnet ist.

value

Der durch das Parsen erzeugte Wert.

contextOptional

Ein Kontextobjekt, das den Zustand enthält, der für den aktuellen Ausdruck relevant ist, der wiederhergestellt wird. Es ist ein neues Objekt für jeden Aufruf der Reviver-Funktion. Es wird nur beim Wiederherstellen von primitiven Werten übergeben, aber nicht, wennvalue ein Objekt oder Array ist. Es enthält die folgende Eigenschaft:

source

Der ursprüngliche JSON-String, der diesen Wert darstellt.

Rückgabewert

Das entsprechendeObject,Array, der String, die Nummer, der boolesche Wert oder dernull-Wert zur angegebenen JSONtext.

Ausnahmen

SyntaxError

Wird ausgelöst, wenn der zu parsende String kein gültiges JSON ist.

Beschreibung

JSON.parse() analysiert einen JSON-String gemäß derJSON-Grammatik und bewertet den String, als wäre es ein JavaScript-Ausdruck. Der einzige Fall, in dem ein Stück JSON-Text einen anderen Wert als der gleiche JavaScript-Ausdruck darstellt, ist beim Umgang mit dem Schlüssel"__proto__" — sieheObjektliteral-Syntax vs. JSON.

Der reviver-Parameter

Wenn einreviver angegeben ist, wird der durch das Parsen berechnete Werttransformiert, bevor er zurückgegeben wird. Genau gesagt, laufen der berechnete Wert und alle seine Eigenschaften (in einerTiefensuche-Reihenfolge, beginnend mit den am tiefsten geschachtelten Eigenschaften und fortfahrend bis zum ursprünglichen Wert selbst) einzeln durch denreviver.

Derreviver wird mit dem Objekt, das die verarbeitete Eigenschaft enthält, alsthis aufgerufen (es sei denn, Sie definieren denreviver als Pfeilfunktion, in diesem Fall gibt es keine separatethis-Bindung) und zwei Argumenten:key undvalue, die den Eigenschaftsnamen als String (auch für Arrays) und den Eigenschaftswert darstellen. Für primitive Werte wird ein zusätzlichercontext-Parameter übergeben, der den Quelltext dieses Wertes enthält. Wenn diereviver-Funktionundefined zurückgibt (oder keinen Wert zurückgibt — z.B. wenn die Ausführung am Ende der Funktion endet), wird die Eigenschaft aus dem Objekt gelöscht. Andernfalls wird die Eigenschaft neu definiert, um den zurückgegebenen Wert zu sein. Wenn derreviver nur einige Werte transformiert und andere nicht, müssen Sie sicherstellen, dass alle nicht transformierten Werte unverändert zurückgegeben werden — andernfalls werden sie aus dem resultierenden Objekt gelöscht.

Ähnlich wie derreplacer-Parameter vonJSON.stringify(), wird bei Arrays und Objekten derreviver zuletzt auf den Wurzelwert mit einem leeren String alskey und dem Wurzelobjekt alsvalue aufgerufen. Für andere gültige JSON-Werte funktioniert derreviver ähnlich und wird einmal mit einem leeren String alskey und dem Wert selbst alsvalue aufgerufen.

Wenn Sie einen anderen Wert alsreviver zurückgeben, wird dieser Wert den ursprünglich geparsten Wert vollständig ersetzen. Dies gilt sogar für den Wurzelwert. Zum Beispiel:

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

Es gibt keine Möglichkeit, dies allgemein zu umgehen. Sie können den Fall, in dem derkey ein leerer String ist, nicht speziell behandeln, da JSON-Objekte auch Schlüssel mit leeren Strings enthalten können. Sie müssen sehr genau wissen, welche Art von Transformation für jeden Schlüssel bei der Implementierung des Revivers erforderlich ist.

Beachten Sie, dass derreviver ausgeführt wird, nachdem der Wert geparst wurde. Beispielsweise werden Zahlen im JSON-Text bereits in JavaScript-Zahlen umgewandelt und können dabei an Genauigkeit verlieren. Eine Möglichkeit, große Zahlen ohne Genauigkeitsverlust zu übertragen, besteht darin, sie als Strings zu serialisieren und sie inBigInts oder andere geeignete beliebige Präzisionsformate wiederherzustellen.

Sie können auch die Eigenschaftcontext.source verwenden, um auf den ursprünglichen JSON-Quelltext zuzugreifen, der den Wert darstellt, wie unten gezeigt:

js
const bigJSON = '{"gross_gdp": 12345678901234567890}';const bigObj = JSON.parse(bigJSON, (key, value, context) => {  if (key === "gross_gdp") {    // Ignore the value because it has already lost precision    return BigInt(context.source);  }  return value;});

Beispiele

Nutzung von JSON.parse()

js
JSON.parse("{}"); // {}JSON.parse("true"); // trueJSON.parse('"foo"'); // "foo"JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]JSON.parse("null"); // null

Nutzung des reviver-Parameters

js
JSON.parse(  '{"p": 5}',  (key, value) =>    typeof value === "number"      ? value * 2 // return value * 2 for numbers      : value, // return everything else unchanged);// { 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// ""

Nutzung von reviver in Verbindung mit dem replacer von JSON.stringify()

Damit ein Wert ordnungsgemäß zurückgegeben wird (d.h. er wird in das ursprüngliche Objekt deserialisiert), muss der Serialisierungsprozess die Typinformationen bewahren. Zum Beispiel können Sie denreplacer-Parameter vonJSON.stringify() zu diesem Zweck verwenden:

js
// Maps are normally serialized as objects with no properties.// We can use the replacer to specify the entries to be serialized.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" }

Da JSON keine syntaktische Möglichkeit bietet, Typ-Metadaten zu annotieren, müssen Sie eine der folgenden Methoden berücksichtigen, um Werte wiederherzustellen, die keine einfachen Objekte sind:

  • Serialisieren Sie das gesamte Objekt zu einem String und versehen Sie es mit einem Typ-Tag.
  • "Raten" Sie basierend auf der Struktur der Daten (z.B. ein Array von Zweier-Arrays)
  • Wenn die Struktur der Nutzdaten fest ist, basierend auf dem Eigenschaftsnamen (z.B. halten alle Eigenschaften namensregistryMap-Objekte).

Ungültiges JSON

WennJSON.parse einen String erhält, der nicht der JSON-Grammatik entspricht, wirft es einenSyntaxError.

Arrays und Objekte dürfen im JSON keineabgeschlossenen Kommata haben:

js
JSON.parse("[1, 2, 3, 4, ]");// SyntaxError: Unexpected token ] in JSON at position 13JSON.parse('{"foo": 1, }');// SyntaxError: Unexpected token } in JSON at position 12

JSON-Strings müssen durch doppelte (nicht einfache) Anführungszeichen begrenzt sein:

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

Wenn Sie JSON innerhalb eines JavaScript-Stringliterals schreiben, sollten Sie entweder einfache Anführungszeichen verwenden, um den JavaScript-Stringliteral zu begrenzen, oder die doppelten Anführungszeichen maskieren, die den JSON-String begrenzen:

js
JSON.parse('{"foo": 1}'); // OKJSON.parse("{\"foo\": 1}"); // OK

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-json.parse

Browser-Kompatibilität

Siehe auch

MDN-Feedback-Box

Diese Seite wurde automatisch aus dem Englischen übersetzt.


[8]ページ先頭

©2009-2025 Movatter.jp