Start · Sprachen · JavaScript · Referenz · JSON

JSON

Klasse

Das <code>JSON</code>-Namespace-Objekt enthält statische Methoden zum Parsen und Erzeugen von JavaScript Object Notation (JSON).

seit JavaScript ES5 Kategorie: core

Signatur

JSON

Beschreibung

Das JSON-Namespace-Objekt enthält statische Methoden zum Parsen von Werten aus und Konvertieren von Werten in JavaScript Object Notation (JSON).

Anders als die meisten globalen Objekte ist JSON kein Konstruktor. Sie können es nicht mit dem new-Operator verwenden oder das JSON-Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden von JSON sind statisch (genau wie beim Math-Objekt).

Unterschiede zwischen JavaScript und JSON

JSON ist eine Syntax zur Serialisierung von Objekten, Arrays, Zahlen, Strings, Booleans und null. Sie basiert auf der JavaScript-Syntax, ist aber davon unterschieden: Der Großteil von JavaScript ist nicht JSON. Zum Beispiel:

  • Objekte und Arrays: Eigenschaftsnamen müssen doppelt gequotete Strings sein; trailing commas sind verboten.
  • Zahlen: Führende Nullen sind unzulässig. Auf einen Dezimalpunkt muss mindestens eine Ziffer folgen. NaN und Infinity werden nicht unterstützt.

Jeder JSON-Text ist ein gültiger JavaScript-Ausdruck, allerdings erst nach der Revision des JSON supersets. Vor der Revision waren U+2028 LINE SEPARATOR und U+2029 PARAGRAPH SEPARATOR in String-Literalen und Property Keys in JSON erlaubt; dieselbe Verwendung in JavaScript-String-Literalen war jedoch ein SyntaxError.

Weitere Unterschiede sind, dass nur doppelt gequotete Strings erlaubt sind und es keine Unterstützung für undefined oder Kommentare gibt. Für alle, die ein menschenfreundlicheres Konfigurationsformat auf Basis von JSON verwenden möchten, gibt es JSON5, das vom Babel-Compiler genutzt wird, und das häufiger verwendete YAML.

Derselbe Text kann in JavaScript-Objektliteralen und JSON unterschiedliche Werte darstellen. Weitere Informationen finden Sie unter „Object literal syntax vs. JSON".

Vollständige JSON-Grammatik

Gültige JSON-Syntax ist formal durch eine Grammatik definiert, ausgedrückt in ABNF und übernommen aus dem IETF-JSON-Standard (RFC 8259).

Unbedeutender Whitespace darf überall vorkommen, außer innerhalb einer JSONNumber (Zahlen dürfen keinen Whitespace enthalten) oder eines JSONString (wo er als entsprechendes Zeichen im String interpretiert würde oder einen Fehler verursachen würde). Tab (U+0009), Carriage Return (U+000D), Line Feed (U+000A) und Space (U+0020) sind die einzigen gültigen Whitespace-Zeichen.

Statische Eigenschaften

  • JSON[Symbol.toStringTag]: Der initiale Wert der [Symbol.toStringTag]-Eigenschaft ist der String "JSON". Diese Eigenschaft wird in Object.prototype.toString() verwendet.

Statische Methoden

  • JSON.isRawJSON(): Prüft, ob ein Wert ein von JSON.rawJSON() zurückgegebenes Objekt ist.
  • JSON.parse(): Parst einen String-Text als JSON, transformiert optional den erzeugten Wert und dessen Eigenschaften, und gibt den Wert zurück.
  • JSON.rawJSON(): Erzeugt ein „raw JSON"-Objekt, das ein Stück JSON-Text enthält. Bei der Serialisierung zu JSON wird das raw-JSON-Objekt so behandelt, als wäre es bereits ein Stück JSON. Der Text muss gültiges JSON sein.
  • JSON.stringify(): Gibt einen JSON-String zurück, der dem angegebenen Wert entspricht, wobei optional nur bestimmte Eigenschaften einbezogen oder Eigenschaftswerte benutzerdefiniert ersetzt werden können.

Rückgabewert

Typ
void
Beschreibung
JSON ist kein Konstruktor und wird nicht instanziert. Die statischen Methoden geben eigene Rückgabewerte zurück.

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"
        }
      }
    }
  }
}

JSON-String mit JSON.parse() in ein Objekt 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 Zahlenserialisierung – Ausgangsdaten

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,
};

Serialisierung als JSON-String

// 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;
});

Serialisierung als JSON-Zahl mit JSON.rawJSON()

// 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;
});

Parsen mit context.source zur Präzisionserhaltung

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 }

// Wichtig · Fallstricke

JSON kann Zahlenliterale beliebiger Genauigkeit enthalten. Da JavaScript jedoch Fließkommadarstellung mit fester Präzision verwendet, ist es nicht möglich, alle JSON-Zahlen exakt in JavaScript darzustellen. Beim Parsen von JSON mit hochpräzisen Zahlen in JavaScript ist besondere Vorsicht geboten: Wenn JSON.parse() die reviver-Funktion aufruft, ist der empfangene Wert bereits geparst (und hat an Präzision verloren). Sie können den context.source-Parameter der reviver-Funktion nutzen, um die Zahl selbst neu zu parsen.