Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
JSON
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
* Some parts of this feature may have varying levels of support.
DasJSON Namensraumobjekt enthält statische Methoden zum Parsen von Werten aus und zum Konvertieren von Werten inJavaScript Object Notation (JSON).
In diesem Artikel
Beschreibung
Im Gegensatz zu den meisten globalen Objekten istJSON kein Konstruktor. Sie können es nicht mit demnew Operator verwenden oder dasJSON Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden vonJSON sind statisch (genau wie dasMath Objekt).
Unterschiede zwischen JavaScript und JSON
JSON ist eine Syntax zum Serialisieren von Objekten, Arrays, Zahlen, Strings, Booleans undnull. Es basiert auf der JavaScript-Syntax, ist aber von JavaScript zu unterscheiden: Das meiste von JavaScript istnicht JSON. Zum Beispiel:
- Objekte und Arrays
Eigenschaftsnamen müssen doppelt-angeführte Strings sein;nachgestellte Kommata sind verboten.
- Zahlen
Führende Nullen sind verboten. Ein Dezimalpunkt muss von mindestens einer Ziffer gefolgt werden.
NaNundInfinitywerden nicht unterstützt.
Jeder JSON-Text ist ein gültiger JavaScript-Ausdruck, aber nur nach derJSON superset Revision. Vor der Revision sind U+2028 LINE SEPARATOR und U+2029 PARAGRAPH SEPARATOR in String-Literalen und Eigenschaftsschlüsseln in JSON erlaubt; aber die gleiche Verwendung in JavaScript-String-Literalen führt zu einemSyntaxError.
Weitere Unterschiede umfassen die Erlaubnis von nur doppelt-angeführten Strings und keine Unterstützung fürundefined oder Kommentare. Für diejenigen, die ein benutzerfreundlicheres Konfigurationsformat basierend auf JSON verwenden möchten, gibt esJSON5, das vom Babel-Compiler verwendet wird, und das häufiger verwendeteYAML.
Der gleiche Text kann in JavaScript-Objektliteralen vs. JSON unterschiedliche Werte darstellen. Weitere Informationen finden Sie unterObjektliteral-Syntax vs. JSON.
Vollständige JSON-Grammatik
Die gültige JSON-Syntax wird formal durch die folgende Grammatik definiert, ausgedrückt inABNF, und aus demIETF JSON-Standard (RFC) übernommen:
JSON-text = ws value wsbegin-array = ws %x5B ws ; [ left square bracketbegin-object = ws %x7B ws ; { left curly bracketend-array = ws %x5D ws ; ] right square bracketend-object = ws %x7D ws ; } right curly bracketname-separator = ws %x3A ws ; : colonvalue-separator = ws %x2C ws ; , commaws = *( %x20 / ; Space %x09 / ; Horizontal tab %x0A / ; Line feed or New line %x0D ; Carriage return )value = false / null / true / object / array / number / stringfalse = %x66.61.6c.73.65 ; falsenull = %x6e.75.6c.6c ; nulltrue = %x74.72.75.65 ; trueobject = begin-object [ member *( value-separator member ) ] end-objectmember = string name-separator valuearray = begin-array [ value *( value-separator value ) ] end-arraynumber = [ minus ] int [ frac ] [ exp ]decimal-point = %x2E ; .digit1-9 = %x31-39 ; 1-9e = %x65 / %x45 ; e Eexp = e [ minus / plus ] 1*DIGITfrac = decimal-point 1*DIGITint = zero / ( digit1-9 *DIGIT )minus = %x2D ; -plus = %x2B ; +zero = %x30 ; 0string = quotation-mark *char quotation-markchar = unescaped / escape ( %x22 / ; " quotation mark U+0022 %x5C / ; \ reverse solidus U+005C %x2F / ; / solidus U+002F %x62 / ; b backspace U+0008 %x66 / ; f form feed U+000C %x6E / ; n line feed U+000A %x72 / ; r carriage return U+000D %x74 / ; t tab U+0009 %x75 4HEXDIG ) ; uXXXX U+XXXXescape = %x5C ; \quotation-mark = %x22 ; "unescaped = %x20-21 / %x23-5B / %x5D-10FFFFHEXDIG = DIGIT / %x41-46 / %x61-66 ; 0-9, A-F, or a-f ; HEXDIG equivalent to HEXDIG rule in [RFC5234]DIGIT = %x30-39 ; 0-9 ; DIGIT equivalent to DIGIT rule in [RFC5234]UnbedeutendeLeerzeichen können überall vorhanden sein, außer innerhalb einesJSONNumber (Zahlen dürfen keine Leerzeichen enthalten) oderJSONString (wo sie als entsprechendes Zeichen in der Zeichenkette interpretiert werden, oder einen Fehler verursachen würden). Die Tabulatorzeichen (U+0009), Wagenrücklauf (U+000D), Zeilenumbruch (U+000A) und Leerzeichen (U+0020) sind die einzigen gültigen Leerzeichen-Zeichen.
Statische Eigenschaften
JSON[Symbol.toStringTag]Der Anfangswert der
[Symbol.toStringTag]Eigenschaft ist der String"JSON". Diese Eigenschaft wird inObject.prototype.toString()verwendet.
Statische Methoden
JSON.isRawJSON()Testet, ob ein Wert ein Objekt ist, das von
JSON.rawJSON()zurückgegeben wurde.JSON.parse()Ein Stück Stringtext als JSON parsen, optional den erzeugten Wert und dessen Eigenschaften transformieren, und den Wert zurückgeben.
JSON.rawJSON()Erstellt ein "roh JSON"-Objekt, das ein Stück JSON-Text enthält. Wenn es als JSON serialisiert wird, wird das rohe JSON-Objekt so behandelt, als wäre es bereits ein Stück JSON. Dieser Text muss gültiges JSON sein.
JSON.stringify()Gibt einen JSON-String zurück, der dem angegebenen Wert entspricht, wobei optional nur bestimmte Eigenschaften eingeschlossen oder Eigenschaftswerte auf benutzerdefinierte Weise ersetzt werden.
Beispiele
>Beispiel-JSON
{ "browsers": { "firefox": { "name": "Firefox", "pref_url": "about:config", "releases": { "1": { "release_date": "2004-11-09", "status": "retired", "engine": "Gecko", "engine_version": "1.7" } } } }}Sie können dieJSON.parse() Methode verwenden, um den obigen JSON-String in ein JavaScript-Objekt zu konvertieren:
const jsonText = `{ "browsers": { "firefox": { "name": "Firefox", "pref_url": "about:config", "releases": { "1": { "release_date": "2004-11-09", "status": "retired", "engine": "Gecko", "engine_version": "1.7" } } } }}`;console.log(JSON.parse(jsonText));Verlustfreie Nummernserialisierung
JSON kann Zahlenliterale beliebiger Genauigkeit enthalten. Es ist jedoch nicht möglich, alle JSON-Zahlen exakt in JavaScript darzustellen, da JavaScript eine Gleitkommadarstellung verwendet, die eine feste Genauigkeit aufweist. Zum Beispiel,12345678901234567890 === 12345678901234567000 in JavaScript, weil sie die gleiche Gleitkommadarstellung haben. Das bedeutet, dass es keine JavaScript-Zahl gibt, die genau der12345678901234567890 JSON-Zahl entspricht.
Angenommen, Sie haben eine exakte Darstellung einer Zahl (entweder überBigInt oder eine benutzerdefinierte Bibliothek):
const data = { // Using a BigInt here to store the exact value, // but it can also be a custom high-precision number library, // if the number might not be an integer. gross_gdp: 12345678901234567890n,};Sie möchten sie serialisieren und dann in die gleiche exakte Zahl parsen. Es gibt mehrere Schwierigkeiten:
- Auf der Serialisierungsseite, um eine Zahl in JSON zu erhalten, müssen Sie eine Zahl an
JSON.stringifyübergeben, entweder über diereplacerFunktion oder über dietoJSONMethode. Aber in beiden Fällen haben Sie bereits die Genauigkeit während der Zahlenkonvertierung verloren. Wenn Sie einen String anJSON.stringifyübergeben, wird er als String serialisiert, nicht als Zahl. - Auf der Parseseite können nicht alle Zahlen genau dargestellt werden. Zum Beispiel gibt
JSON.parse("12345678901234567890")12345678901234568000zurück, weil die Zahl auf die am nächsten darstellbare Zahl gerundet wird. Selbst wenn Sie einereviverFunktion verwenden, wird die Zahl bereits gerundet sein, bevor diereviverFunktion aufgerufen wird.
Es gibt im Allgemeinen zwei Möglichkeiten, um sicherzustellen, dass Zahlen verlustfrei in JSON konvertiert und zurückgeparst werden: Eine beinhaltet eine JSON-Zahl, die andere einen JSON-String. JSON ist einKommunikationsformat, also wenn Sie JSON verwenden, kommunizieren Sie wahrscheinlich mit einem anderen System (HTTP-Anfrage, Speicherung in einer Datenbank, etc.). Die beste Lösung hängt von dem empfangenden System ab.
Verwendung von JSON-Strings
Wenn das empfangende System nicht die gleichen JSON-Verarbeitungskapazitäten wie JavaScript hat und keine hochpräzisen Zahlen unterstützt, möchten Sie die Zahl möglicherweise als String serialisieren und dann auf der Empfängerseite als String behandeln. Dies ist auch die einzige Option im älteren JavaScript.
Um festzulegen, wie benutzerdefinierte Datentypen (einschließlichBigInt) in JSON serialisiert werden sollen, fügen Sie entweder einetoJSON Methode zu Ihrem Datentyp hinzu oder verwenden Sie diereplacer Funktion vonJSON.stringify().
// Using toJSON() methodBigInt.prototype.toJSON = function () { return this.toString();};const str1 = JSON.stringify(data);// Using JSON.stringify() with replacerconst str2 = JSON.stringify(data, (key, value) => { if (key === "gross_gdp") { return value.toString(); } return value;});In jedem Fall sieht der JSON-Text wie{"gross_gdp":"12345678901234567890"} aus, wobei der Wert ein String, keine Zahl ist. Dann können Sie auf der Empfängerseite das JSON parsen und den String behandeln.
Verwendung von JSON-Zahlen
Wenn der Empfänger dieser Nachricht nativ hochpräzise Zahlen unterstützt (wie Python-Integer), ist es offensichtlich besser, Zahlen als JSON-Zahlen zu übergeben, da sie direkt in den hochpräzisen Typ geparst werden können, anstatt einen String aus JSON zu parsen und dann eine Zahl aus dem String zu parsen. In JavaScript können Sie beliebige Datentypen zu JSON-Zahlen serialisieren, ohne zuerst einen Zahlenwert zu erzeugen (was zu Präzisionsverlust führt), indem SieJSON.rawJSON() verwenden, um genau anzugeben, wie der JSON-Quelltext sein soll.
// Using toJSON() methodBigInt.prototype.toJSON = function () { return JSON.rawJSON(this.toString());};const str1 = JSON.stringify(data);// Using JSON.stringify() with replacerconst str2 = JSON.stringify(data, (key, value) => { if (key === "gross_gdp") { return JSON.rawJSON(value.toString()); } return value;});Der anJSON.rawJSON übergebene Text wird behandelt, als wäre er bereits ein Stück JSON, sodass er nicht erneut als String serialisiert wird. Daher sieht der JSON-Text wie{"gross_gdp":12345678901234567890} aus, wobei der Wert eine Zahl ist. Diesen JSON kann der Empfänger ohne zusätzliche Verarbeitung parsen, vorausgesetzt, das empfangende System hat nicht dieselben Genauigkeitsbeschränkungen wie JavaScript.
Beim Parsen von JSON, das hochpräzise Zahlen in JavaScript enthält, ist besondere Vorsicht geboten, da beim Aufruf derreviver Funktion durchJSON.parse() der von Ihnen empfangene Wert bereits geparst (und damit ungenau) ist. Sie können dencontext.source Parameter derJSON.parse()reviver Funktion verwenden, um die Zahl selbst erneut zu parsen.
const parsedData = JSON.parse(str, (key, value, context) => { if (key === "gross_gdp") { // Or use the constructor of your custom high-precision number library return BigInt(context.source); } return value;});// { gross_gdp: 12345678901234567890n }Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-json-object> |