JSON与JavaScript有什么关系_如何解析和序列化数据

JSON是独立于JavaScript的语言无关数据格式,仅支持null、boolean、number、string、array、object六种类型,不支持函数、undefined等;JSON.parse()和JSON.stringify()是原生纯数据转换方法,严格遵循双引号、无注释、无尾逗号等语法规则。

JSON 是 JavaScript 的一个子集,但不是 JavaScript 代码

JSON(JavaScript Object Notation)语法源自 JavaScript,但它是独立的、语言无关的数据格式。它只支持 nullbooleannumberstringarrayobject 六种类型,不支持函数、undefinedDateRegExp 或循环引用。这意味着:

JSON.parse('{ "x": undefined }')
会直接报错 SyntaxError: Unexpected token u in JSON at position 9——因为 undefined 不是合法 JSON。

JSON.parse()JSON.stringify() 是唯一标准解析/序列化方法

浏览器和 Node.js 原生提供这两个函数,不依赖外部库。它们不执行代码、不调用构造函数、不处理原型链,纯数据转换:

  • JSON.parse() 只接受字符串输入;传入对象会抛 TypeError: JSON.parse requires a string
  • JSON.stringify() 遇到不可序列化的值(如 functionundefinedSymbol)会静默忽略该属性(对象中)或转为 null(数组中)
  • 第二个参数可传 replacer 函数或数组,用于过滤或修改键值;第三个参数可传缩进空格数(如 2),仅影响格式,不影响语义

示例:

JSON.stringify({ a: 1, b: undefined, c: () => {} }, null, 2)
// 输出:
// {
//   "a": 1
// }

常见解析失败原因:空格、BOM、单引号、尾逗号、注释

JSON 格式严格,以下写法全部非法:

  • 用单引号包裹字符串:'{"key":"value"}' → 必须双引号
  • 末尾多逗号:{"a":1,} → 解析失败
  • 含 UTF-8 BOM(\uFEFF)开头的响应体 → JSON.parse() 报错 Unexpected token
  • HTTP 响应头未设 Content-Type: application/json,但后端返回了 HTML 错误页(如 500 页面)→ 实际拿到的是 HTML 字符串,不是 JSON

调试建议:先 console.log(typeof data, data.slice(0, 50)) 确认是不是字符串,再检查前几个字符是否为 {[

需要自定义行为时,别改 JSON.parse,用封装函数处理边界

比如后端返回日期字符串 "2025-06-15T12:34:56Z",想自动转成 Date 对象;或遇到 null 字段想默认填空字符串。这时不该 monkey patch JSON.parse,而应:

  • JSON.parse(str, (key, value) => { ... }) 的 reviver 参数做类型修复
  • undefined 字段做 fallback,应在业务层处理,而非试图让 JSON.stringify 输出 undefined
  • 需序列化 DateMapSet 等类型时,必须手动在 replacer 中转换,例如:
    JSON.stringify(new Date(), (k, v) => v instanceof Date ? v.toISOString() : v)

真正容易被忽略的是:JSON 规范不定义时间、二进制、大数(BigInt)的表示方式,这些都得靠业务协议约定,不能指望解析器自动理解。