JSON.rawJSON()
JSON.rawJSON()
静态方法创建一个包含一段 JSON 文本的“原始 JSON”对象。当序列化为 JSON 时,原始 JSON 对象被视为已经是 JSON 片段。此文本必须是有效的 JSON。
语法
JSON.rawJSON(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
生成数字文字 12345678901234567000
,因为根本没有对应的 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(JSON.parse(objStr).value); // 😄
请注意,rawJSON
中的反斜杠实际上表示单个斜杠字符,因此 JSON 文本如下所示
{"value":"\ud83d\ude04"}
规范
规范 |
---|
JSON.parse 源文本访问 # sec-json.rawjson |
浏览器兼容性
BCD 表格仅在浏览器中加载