| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/JSON | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Juli 2015 browserbergreifend verfgbar.
* Einige Teile dieser Funktion werden mglicherweise unterschiedlich gut untersttzt.
Das JSON Namensraumobjekt enthlt statische Methoden zum Parsen von Werten aus und zum Konvertieren von Werten in JavaScript Object Notation (JSON).
Im Gegensatz zu den meisten globalen Objekten ist JSON kein Konstruktor. Sie knnen es nicht mit dem new Operator verwenden oder das JSON Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden von JSON sind statisch (genau wie das Math Objekt).
JSON ist eine Syntax zum Serialisieren von Objekten, Arrays, Zahlen, Strings, Booleans und null. Es basiert auf der JavaScript-Syntax, ist aber von JavaScript zu unterscheiden: Das meiste von JavaScript ist nicht JSON. Zum Beispiel:
Eigenschaftsnamen mssen doppelt-angefhrte Strings sein; nachgestellte Kommata sind verboten.
Fhrende Nullen sind verboten. Ein Dezimalpunkt muss von mindestens einer Ziffer gefolgt werden. NaN und Infinity werden nicht untersttzt.
Jeder JSON-Text ist ein gltiger JavaScript-Ausdruck, aber nur nach der JSON superset Revision. Vor der Revision sind U+2028 LINE SEPARATOR und U+2029 PARAGRAPH SEPARATOR in String-Literalen und Eigenschaftsschlsseln in JSON erlaubt; aber die gleiche Verwendung in JavaScript-String-Literalen fhrt zu einem SyntaxError.
Weitere Unterschiede umfassen die Erlaubnis von nur doppelt-angefhrten Strings und keine Untersttzung fr undefined oder Kommentare. Fr diejenigen, die ein benutzerfreundlicheres Konfigurationsformat basierend auf JSON verwenden mchten, gibt es JSON5, das vom Babel-Compiler verwendet wird, und das hufiger verwendete YAML.
Der gleiche Text kann in JavaScript-Objektliteralen vs. JSON unterschiedliche Werte darstellen. Weitere Informationen finden Sie unter Objektliteral-Syntax vs. JSON.
Die gltige JSON-Syntax wird formal durch die folgende Grammatik definiert, ausgedrckt in ABNF, und aus dem IETF JSON-Standard (RFC) bernommen:
JSON-text = ws value ws
begin-array = ws %x5B ws ; [ left square bracket
begin-object = ws %x7B ws ; { left curly bracket
end-array = ws %x5D ws ; ] right square bracket
end-object = ws %x7D ws ; } right curly bracket
name-separator = ws %x3A ws ; : colon
value-separator = ws %x2C ws ; , comma
ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ; Carriage return
)
value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true
object = begin-object [ member *( value-separator member ) ]
end-object
member = string name-separator value
array = begin-array [ value *( value-separator value ) ] end-array
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D ; -
plus = %x2B ; +
zero = %x30 ; 0
string = quotation-mark *char quotation-mark
char = 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+XXXX
escape = %x5C ; \
quotation-mark = %x22 ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
HEXDIG = 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]
Unbedeutende Leerzeichen knnen berall vorhanden sein, auer innerhalb eines JSONNumber (Zahlen drfen keine Leerzeichen enthalten) oder JSONString (wo sie als entsprechendes Zeichen in der Zeichenkette interpretiert werden, oder einen Fehler verursachen wrden). Die Tabulatorzeichen (U+0009), Wagenrcklauf (U+000D), Zeilenumbruch (U+000A) und Leerzeichen (U+0020) sind die einzigen gltigen Leerzeichen-Zeichen.
JSON[Symbol.toStringTag]Der Anfangswert der [Symbol.toStringTag] Eigenschaft ist der String "JSON". Diese Eigenschaft wird in Object.prototype.toString() verwendet.
JSON.isRawJSON()Testet, ob ein Wert ein Objekt ist, das von JSON.rawJSON() zurckgegeben wurde.
JSON.parse()Ein Stck Stringtext als JSON parsen, optional den erzeugten Wert und dessen Eigenschaften transformieren, und den Wert zurckgeben.
JSON.rawJSON()Erstellt ein "roh JSON"-Objekt, das ein Stck JSON-Text enthlt. Wenn es als JSON serialisiert wird, wird das rohe JSON-Objekt so behandelt, als wre es bereits ein Stck JSON. Dieser Text muss gltiges JSON sein.
JSON.stringify()Gibt einen JSON-String zurck, der dem angegebenen Wert entspricht, wobei optional nur bestimmte Eigenschaften eingeschlossen oder Eigenschaftswerte auf benutzerdefinierte Weise ersetzt werden.
{
"browsers": {
"firefox": {
"name": "Firefox",
"pref_url": "about:config",
"releases": {
"1": {
"release_date": "2004-11-09",
"status": "retired",
"engine": "Gecko",
"engine_version": "1.7"
}
}
}
}
}
Sie knnen die JSON.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));
JSON kann Zahlenliterale beliebiger Genauigkeit enthalten. Es ist jedoch nicht mglich, 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 der 12345678901234567890 JSON-Zahl entspricht.
Angenommen, Sie haben eine exakte Darstellung einer Zahl (entweder ber BigInt 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 mchten sie serialisieren und dann in die gleiche exakte Zahl parsen. Es gibt mehrere Schwierigkeiten:
JSON.stringify bergeben, entweder ber die replacer Funktion oder ber die toJSON Methode. Aber in beiden Fllen haben Sie bereits die Genauigkeit whrend der Zahlenkonvertierung verloren. Wenn Sie einen String an JSON.stringify bergeben, wird er als String serialisiert, nicht als Zahl.JSON.parse("12345678901234567890") 12345678901234568000 zurck, weil die Zahl auf die am nchsten darstellbare Zahl gerundet wird. Selbst wenn Sie eine reviver Funktion verwenden, wird die Zahl bereits gerundet sein, bevor die reviver Funktion aufgerufen wird.Es gibt im Allgemeinen zwei Mglichkeiten, um sicherzustellen, dass Zahlen verlustfrei in JSON konvertiert und zurckgeparst werden: Eine beinhaltet eine JSON-Zahl, die andere einen JSON-String. JSON ist ein Kommunikationsformat, also wenn Sie JSON verwenden, kommunizieren Sie wahrscheinlich mit einem anderen System (HTTP-Anfrage, Speicherung in einer Datenbank, etc.). Die beste Lsung hngt von dem empfangenden System ab.
Wenn das empfangende System nicht die gleichen JSON-Verarbeitungskapazitten wie JavaScript hat und keine hochprzisen Zahlen untersttzt, mchten Sie die Zahl mglicherweise als String serialisieren und dann auf der Empfngerseite als String behandeln. Dies ist auch die einzige Option im lteren JavaScript.
Um festzulegen, wie benutzerdefinierte Datentypen (einschlielich BigInt) in JSON serialisiert werden sollen, fgen Sie entweder eine toJSON Methode zu Ihrem Datentyp hinzu oder verwenden Sie die replacer Funktion von JSON.stringify().
// Using toJSON() method
BigInt.prototype.toJSON = function () {
return this.toString();
};
const str1 = JSON.stringify(data);
// Using JSON.stringify() with replacer
const 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 knnen Sie auf der Empfngerseite das JSON parsen und den String behandeln.
Wenn der Empfnger dieser Nachricht nativ hochprzise Zahlen untersttzt (wie Python-Integer), ist es offensichtlich besser, Zahlen als JSON-Zahlen zu bergeben, da sie direkt in den hochprzisen Typ geparst werden knnen, anstatt einen String aus JSON zu parsen und dann eine Zahl aus dem String zu parsen. In JavaScript knnen Sie beliebige Datentypen zu JSON-Zahlen serialisieren, ohne zuerst einen Zahlenwert zu erzeugen (was zu Przisionsverlust fhrt), indem Sie JSON.rawJSON() verwenden, um genau anzugeben, wie der JSON-Quelltext sein soll.
// Using toJSON() method
BigInt.prototype.toJSON = function () {
return JSON.rawJSON(this.toString());
};
const str1 = JSON.stringify(data);
// Using JSON.stringify() with replacer
const str2 = JSON.stringify(data, (key, value) => {
if (key === "gross_gdp") {
return JSON.rawJSON(value.toString());
}
return value;
});
Der an JSON.rawJSON bergebene Text wird behandelt, als wre er bereits ein Stck 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 Empfnger ohne zustzliche Verarbeitung parsen, vorausgesetzt, das empfangende System hat nicht dieselben Genauigkeitsbeschrnkungen wie JavaScript.
Beim Parsen von JSON, das hochprzise Zahlen in JavaScript enthlt, ist besondere Vorsicht geboten, da beim Aufruf der reviver Funktion durch JSON.parse() der von Ihnen empfangene Wert bereits geparst (und damit ungenau) ist. Sie knnen den context.source Parameter der JSON.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 }
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-json-object |
JSONDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |