JSON.rawJSON()

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表

JSON.rawJSON() 静态方法创建一个包含一段 JSON 文本的“原始 JSON”对象。当序列化为 JSON 时,原始 JSON 对象被视为已经是 JSON 片段。此文本必须是有效的 JSON。

语法

js
JSON.rawJSON(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 生成数字文字 12345678901234567000,因为根本没有对应的 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(JSON.parse(objStr).value); // 😄

请注意,rawJSON 中的反斜杠实际上表示单个斜杠字符,因此 JSON 文本如下所示

json
{"value":"\ud83d\ude04"}

规范

规范
JSON.parse 源文本访问
# sec-json.rawjson

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅