[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/JSON [Back]  [Original]

JSON - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

JSON

Baseline Weitgehend verfgbar *

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).

In diesem Artikel

Beschreibung

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).

Unterschiede zwischen JavaScript und JSON

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:

Objekte und Arrays

Eigenschaftsnamen mssen doppelt-angefhrte Strings sein; nachgestellte Kommata sind verboten.

Zahlen

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.

Vollstndige JSON-Grammatik

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.

Statische Eigenschaften

JSON[Symbol.toStringTag]

Der Anfangswert der [Symbol.toStringTag] Eigenschaft ist der String "JSON". Diese Eigenschaft wird in Object.prototype.toString() verwendet.

Statische Methoden

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.

Beispiele

Beispiel-JSON

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 knnen die JSON.parse() Methode verwenden, um den obigen JSON-String in ein JavaScript-Objekt zu konvertieren:

js
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 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):

js
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:

  • Auf der Serialisierungsseite, um eine Zahl in JSON zu erhalten, mssen Sie eine Zahl an 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.
  • Auf der Parseseite knnen nicht alle Zahlen genau dargestellt werden. Zum Beispiel gibt 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.

Verwendung von JSON-Strings

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().

js
// 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.

Verwendung von JSON-Zahlen

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.

js
// 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.

js
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

Spezifikation
ECMAScript 2027 LanguageSpecification
# sec-json-object

Browser-Kompatibilitt

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page