JSON.rawJSON()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Die statische Methode JSON.rawJSON()
erstellt ein "rohes JSON"-Objekt, das ein Stück JSON-Text enthält. Wenn es in JSON serialisiert wird, wird das rohe JSON-Objekt behandelt, als wäre es bereits ein JSON-Stück. Dieser Text muss gültiges JSON sein.
Syntax
JSON.rawJSON(string)
Parameter
string
-
Der JSON-Text. Muss gültiges JSON darstellen, das einen primitiven Wert repräsentiert.
Rückgabewert
Ein Objekt, das verwendet werden kann, um JSON-Text mit genau demselben Inhalt wie der bereitgestellte string
zu erstellen, ohne Anführungszeichen um den String selbst. Dieses Objekt hat ein null
-Prototyp und ist eingefroren (so dass es niemals versehentlich als reguläres Objekt durch irgendeine Art von primitiver Umwandlung serialisiert wird), und es hat die folgende Eigenschaft:
rawJSON
-
Der ursprüngliche JSON-
string
, der bereitgestellt wurde.
Darüber hinaus hat es eine private Eigenschaft, die es als rohes JSON-Objekt kennzeichnet. Dies ermöglicht es, von JSON.stringify()
und JSON.isRawJSON()
erkannt zu werden.
Ausnahmen
SyntaxError
-
Wird ausgelöst, wenn der
string
kein gültiges JSON ist oder wenn er ein Objekt oder Array darstellt.
Beschreibung
Ein rohes JSON-Objekt kann als eine unveränderliche, atomare Datenstruktur betrachtet werden, ähnlich wie jede Art von Primärwert. Es ist kein reguläres Objekt und enthält keine Daten außer dem rohen JSON-Text. Es wird verwendet, um Daten „vorzuserialisieren“ zu Formaten, die JSON.stringify
selbst aus verschiedenen Gründen nicht erzeugen kann. Der typischste Anwendungsfall ist das Problem des Gleitkomma-Präzisionsverlusts. Zum Beispiel:
JSON.stringify({ value: 12345678901234567890 });
// {"value":12345678901234567000}
Der Wert ist nicht mehr genau äquivalent zur ursprünglichen Zahl! Dies liegt daran, dass JavaScript eine Gleitpunktdarstellung für alle Zahlen verwendet, sodass nicht alle Ganzzahlen exakt dargestellt werden können. Das Zahlenliteral 12345678901234567890
wird bereits gerundet, um die nächst darstellbare Zahl zu sein, wenn es von JavaScript geparst wird.
Ohne JSON.rawJSON
gibt es keine Möglichkeit, JSON.stringify
zu sagen, dass es das Zahlenliteral 12345678901234567890
erzeugen soll, da es einfach keinen entsprechenden JavaScript-Zahlenwert gibt. Mit rohem JSON können Sie direkt angeben, wie JSON.stringify()
einen bestimmten Wert serialisieren soll:
const rawJSON = JSON.rawJSON("12345678901234567890");
JSON.stringify({ value: rawJSON });
// {"value":12345678901234567890}
Für ein vollständigeres Beispiel dazu siehe Verlustfreie Zahlen-Serialisierung.
Beachten Sie, dass obwohl wir einen String an JSON.rawJSON()
übergeben haben, er dennoch eine Zahl im endgültigen JSON wird. Dies liegt daran, dass der String den wörtlichen JSON-Text darstellt. Wenn Sie einen String serialisieren möchten, sollten Sie JSON.rawJSON()
mit einem in Anführungszeichen eingeschlossenen String-Wert verwenden:
const rawJSON = JSON.rawJSON('"Hello world"');
JSON.stringify({ value: rawJSON });
// {"value":"Hello world"}
JSON.rawJSON
ermöglicht es Ihnen, beliebigen JSON-Text einzufügen, erlaubt aber nicht die Erstellung von ungültigem JSON. Alles, was durch die JSON-Syntax nicht erlaubt war, ist auch bei JSON.rawJSON()
nicht erlaubt:
const rawJSON = JSON.rawJSON('"Hello\nworld"'); // Syntax error, because line breaks are not allowed in JSON strings
Außerdem können Sie JSON.rawJSON()
nicht verwenden, um JSON-Objekte oder -Arrays zu erstellen.
Beispiele
Nutzung von JSON.rawJSON() zur Erstellung von JSON-Ausdrücken verschiedener Typen
const numJSON = JSON.rawJSON("123");
const strJSON = JSON.rawJSON('"Hello world"');
const boolJSON = JSON.rawJSON("true");
const nullJSON = JSON.rawJSON("null");
console.log(
JSON.stringify({
age: numJSON,
message: strJSON,
isActive: boolJSON,
nothing: nullJSON,
}),
);
// {"age":123,"message":"Hello world","isActive":true,"nothing":null}
Sie können jedoch JSON.rawJSON()
nicht verwenden, um JSON-Objekte oder -Arrays zu erstellen:
const arrJSON = JSON.rawJSON("[1, 2, 3]");
const objJSON = JSON.rawJSON('{"a": 1, "b": 2}');
// SyntaxError
Verwendung von JSON.rawJSON() zur Erstellung von Escape-Zeichenfolgenliteralen
Neben Zahlen gibt es nur einen anderen Typ, der keine eins-zu-eins Entsprechung zwischen JavaScript-Werten und JSON-Text hat: Zeichenfolgen. Wenn Zeichenfolgen in JSON serialisiert werden, werden alle Codepunkte, mit Ausnahme derer, die in JSON-Zeichenfolgenliteralen nicht zulässig sind (wie etwa Zeilenumbrüche), wörtlich ausgegeben:
console.log(JSON.stringify({ value: "\ud83d\ude04" })); // {"value":"😄"}
Dies kann unerwünscht sein, da der Empfänger dieser Zeichenfolge Unicode möglicherweise anders handhabt. Um die Interoperabilität zu verbessern, können Sie explizit angeben, wie die Zeichenfolge mit Escape-Sequenzen serialisiert werden soll:
const rawJSON = JSON.rawJSON('"\\ud83d\\ude04"');
const objStr = JSON.stringify({ value: rawJSON });
console.log(objStr); // {"value":"\ud83d\ude04"}
console.log(JSON.parse(objStr).value); // 😄
Beachten Sie, dass die doppelten Rückwärtsschrägstriche in der rawJSON
tatsächlich ein einzelnes Schrägstrichzeichen darstellen.
Spezifikationen
Specification |
---|
JSON.parse source text access # sec-json.rawjson |
Browser-Kompatibilität
BCD tables only load in the browser