JSON.isRawJSON()

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

JSON.isRawJSON() 静态方法测试一个值是否是由 JSON.rawJSON() 返回的对象。

语法

js
JSON.isRawJSON(value)

参数

value

要测试的值。

返回值

如果 value 是由 JSON.rawJSON() 创建的,则返回 true;否则返回 false

描述

“原始 JSON”对象在序列化为 JSON 时,会被视为已经是 JSON 片段。此外,由于 JSON.rawJSON() 的工作方式,原始 JSON 保证是语法上有效的 JSON。有关原始 JSON 对象的形状和行为的更多信息,请参阅 JSON.rawJSON()。此方法的存在是为了允许其他序列化库为原始 JSON 对象实现类似于 JSON.stringify() 的行为。

示例

使用 JSON.isRawJSON()

以下示例演示了如何使用 JSON.isRawJSON() 来测试对象是否由 JSON.rawJSON() 返回。它实现了一个自定义序列化程序,该序列化程序将数据序列化为类似 YAML 的格式。

js
function mySerializer(value, indent = "") {
  if (typeof value !== "object" || value === null) {
    return JSON.stringify(value);
  }
  if (JSON.isRawJSON(value)) {
    return value.rawJSON;
  }
  const subIndent = `${indent}  `;
  if (Array.isArray(value)) {
    return `- ${value.map((v) => mySerializer(v, subIndent)).join(`\n${indent}- `)}`;
  }
  return Object.entries(value)
    .map(([key, value]) => {
      const subValue = mySerializer(value, subIndent);
      if (subValue.includes("\n")) {
        return `${key}:\n${subIndent}${subValue}`;
      }
      return `${key}: ${subValue}`;
    })
    .join(`\n${indent}`);
}

console.log(
  mySerializer({
    name: "Josh",
    userId: JSON.rawJSON("12345678901234567890"),
    friends: [
      { name: "Alice", userId: JSON.rawJSON("9876543210987654321") },
      { name: "Bob", userId: JSON.rawJSON("56789012345678901234") },
    ],
  }),
);

// name: "Josh"
// userId: 12345678901234567890
// friends:
//   - name: "Alice"
//     userId: 9876543210987654321
//   - name: "Bob"
//     userId: 56789012345678901234

如果在上面的示例中,userId 值不是由 JSON.rawJSON() 创建的,而是直接作为数字传递的,那么由于 JS 浮点数精度限制,我们将提前损失精度。

js
console.log(
  mySerializer({
    name: "Josh",
    userId: 12345678901234567890,
    friends: [
      { name: "Alice", userId: 9876543210987654321 },
      { name: "Bob", userId: 56789012345678901234 },
    ],
  }),
);

// name: "Josh"
// userId: 12345678901234567000
// friends:
//   - name: "Alice"
//     userId: 9876543210987655000
//   - name: "Bob"
//     userId: 56789012345678900000

规范

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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅