JSON.rawJSON()
JSON.rawJSON() 靜態方法建立一個包含一段 JSON 文字的“原始 JSON”物件。當序列化為 JSON 時,原始 JSON 物件會被視為已經是一段 JSON 文字。此文字必須是有效的 JSON。
語法
JSON.rawJSON(string)
引數
string-
JSON 文字。必須是 **表示原始值** 的有效 JSON。
返回值
一個可用於建立與提供的 string 內容完全相同的 JSON 文字的物件,但字串本身不帶引號。此物件 具有 null 原型 且 被凍結(因此它永遠不會被任何型別的原始值轉換意外地序列化為常規物件),並具有以下屬性
rawJSON-
提供的原始 JSON
string。
此外,它還有一個 私有欄位,用於標記自身為原始 JSON 物件。這使得它能夠被 JSON.stringify() 和 JSON.isRawJSON() 識別。
異常
SyntaxError-
如果
string不是有效的 JSON,或者它表示一個物件或陣列,則丟擲異常。
描述
原始 JSON 物件可以被視為一種不可變的、原子化的資料結構,類似於任何一種 原始型別。它不是一個常規物件,除了原始 JSON 文字之外不包含任何資料。它用於將資料“預序列化”為 JSON.stringify 由於各種原因本身無法生成的格式。最常見的用例是浮點數精度丟失問題。例如:
JSON.stringify({ value: 12345678901234567890 });
// {"value":12345678901234567000}
該值不再與原始數字完全等效!這是因為 JavaScript 對所有數字都使用浮點表示,因此無法精確表示所有整數。數字字面量 12345678901234567890 在被 JavaScript 解析時,本身已經被舍入到最接近的可表示數字。
沒有 JSON.rawJSON,無法告訴 JSON.stringify 生成數字字面量 12345678901234567890,因為根本不存在相應的 JavaScript 數字值。透過原始 JSON,您可以直接告訴 JSON.stringify() 特定值應該如何字串化:
const rawJSON = JSON.rawJSON("12345678901234567890");
JSON.stringify({ value: rawJSON });
// {"value":12345678901234567890}
有關此內容的更完整示例,請參閱 無損數字序列化。
請注意,儘管我們將字串傳遞給了 JSON.rawJSON(),但在最終的 JSON 中它仍然是一個數字。這是因為字串表示的是原始的 JSON 文字。如果您想序列化一個字串,您應該使用 JSON.rawJSON() 並提供一個用引號括起來的字串值:
const rawJSON = JSON.rawJSON('"Hello world"');
JSON.stringify({ value: rawJSON });
// {"value":"Hello world"}
JSON.rawJSON 允許您插入任意 JSON 文字,但不允許您建立無效的 JSON。對於 JSON 語法不允許的任何內容,JSON.rawJSON() 也不允許。
const rawJSON = JSON.rawJSON('"Hello\nworld"'); // Syntax error, because line breaks are not allowed in JSON strings
此外,您不能使用 JSON.rawJSON() 來建立 JSON 物件或陣列。
示例
使用 JSON.rawJSON() 建立不同型別的 JSON 表示式
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 物件或陣列。
const arrJSON = JSON.rawJSON("[1, 2, 3]");
const objJSON = JSON.rawJSON('{"a": 1, "b": 2}');
// SyntaxError
使用 JSON.rawJSON() 建立轉義的字串字面量
除了數字,JavaScript 值和 JSON 文字之間只有一個其他型別沒有一對一的對應關係:字串。當字串序列化為 JSON 時,除了在 JSON 字串字面量中非法(例如換行符)的所有程式碼點外,都會被原樣列印。
console.log(JSON.stringify({ value: "\ud83d\ude04" })); // {"value":"😄"}
這可能不是期望的行為,因為接收此字串的一方可能以不同的方式處理 Unicode。為了提高互操作性,您可以顯式指定要用轉義序列序列化的字串:
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 |
瀏覽器相容性
載入中…