JSON.rawJSON()

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

JSON.rawJSON() 靜態方法建立一個包含一段 JSON 文字的“原始 JSON”物件。當序列化為 JSON 時,原始 JSON 物件會被視為已經是一段 JSON 文字。此文字必須是有效的 JSON。

語法

js
JSON.rawJSON(string)

引數

string

JSON 文字。必須是 **表示原始值** 的有效 JSON。

返回值

一個可用於建立與提供的 string 內容完全相同的 JSON 文字的物件,但字串本身不帶引號。此物件 具有 null 原型被凍結(因此它永遠不會被任何型別的原始值轉換意外地序列化為常規物件),並具有以下屬性

rawJSON

提供的原始 JSON string

此外,它還有一個 私有欄位,用於標記自身為原始 JSON 物件。這使得它能夠被 JSON.stringify()JSON.isRawJSON() 識別。

異常

SyntaxError

如果 string 不是有效的 JSON,或者它表示一個物件或陣列,則丟擲異常。

描述

原始 JSON 物件可以被視為一種不可變的、原子化的資料結構,類似於任何一種 原始型別。它不是一個常規物件,除了原始 JSON 文字之外不包含任何資料。它用於將資料“預序列化”為 JSON.stringify 由於各種原因本身無法生成的格式。最常見的用例是浮點數精度丟失問題。例如:

js
JSON.stringify({ value: 12345678901234567890 });
// {"value":12345678901234567000}

該值不再與原始數字完全等效!這是因為 JavaScript 對所有數字都使用浮點表示,因此無法精確表示所有整數。數字字面量 12345678901234567890 在被 JavaScript 解析時,本身已經被舍入到最接近的可表示數字。

沒有 JSON.rawJSON,無法告訴 JSON.stringify 生成數字字面量 12345678901234567890,因為根本不存在相應的 JavaScript 數字值。透過原始 JSON,您可以直接告訴 JSON.stringify() 特定值應該如何字串化:

js
const rawJSON = JSON.rawJSON("12345678901234567890");
JSON.stringify({ value: rawJSON });
// {"value":12345678901234567890}

有關此內容的更完整示例,請參閱 無損數字序列化

請注意,儘管我們將字串傳遞給了 JSON.rawJSON(),但在最終的 JSON 中它仍然是一個數字。這是因為字串表示的是原始的 JSON 文字。如果您想序列化一個字串,您應該使用 JSON.rawJSON() 並提供一個用引號括起來的字串值:

js
const rawJSON = JSON.rawJSON('"Hello world"');
JSON.stringify({ value: rawJSON });
// {"value":"Hello world"}

JSON.rawJSON 允許您插入任意 JSON 文字,但不允許您建立無效的 JSON。對於 JSON 語法不允許的任何內容,JSON.rawJSON() 也不允許。

js
const rawJSON = JSON.rawJSON('"Hello\nworld"'); // Syntax error, because line breaks are not allowed in JSON strings

此外,您不能使用 JSON.rawJSON() 來建立 JSON 物件或陣列。

示例

使用 JSON.rawJSON() 建立不同型別的 JSON 表示式

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

然而,您不能使用 JSON.rawJSON() 來建立 JSON 物件或陣列。

js
const arrJSON = JSON.rawJSON("[1, 2, 3]");
const objJSON = JSON.rawJSON('{"a": 1, "b": 2}');
// SyntaxError

使用 JSON.rawJSON() 建立轉義的字串字面量

除了數字,JavaScript 值和 JSON 文字之間只有一個其他型別沒有一對一的對應關係:字串。當字串序列化為 JSON 時,除了在 JSON 字串字面量中非法(例如換行符)的所有程式碼點外,都會被原樣列印。

js
console.log(JSON.stringify({ value: "\ud83d\ude04" })); // {"value":"😄"}

這可能不是期望的行為,因為接收此字串的一方可能以不同的方式處理 Unicode。為了提高互操作性,您可以顯式指定要用轉義序列序列化的字串:

js
const rawJSON = JSON.rawJSON('"\\ud83d\\ude04"');
const objStr = JSON.stringify({ value: rawJSON });
console.log(objStr); // {"value":"\ud83d\ude04"}
console.log(JSON.parse(objStr).value); // 😄

請注意,rawJSON 中的雙反斜槓實際上表示單個斜槓字元。

規範

規範
JSON.parse 源文字訪問
# sec-json.rawjson

瀏覽器相容性

另見