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

JSON 是 JavaScript 的一个子集,但不是 JavaScript 代码
JSON(JavaScript Object Notation)语法源自 JavaScript,但它是独立的、语言无关的数据格式。它只支持 null、boolean、number、string、array 和 object 六种类型,不支持函数、undefined、Date、RegExp 或循环引用。这意味着:
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()遇到不可序列化的值(如function、undefined、Symbol)会静默忽略该属性(对象中)或转为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)) 确认是不是字符串,再检查前几个字符是否为 { 或 [。
立即学习“Java免费学习笔记(深入)”;
需要自定义行为时,别改 JSON.parse,用封装函数处理边界
比如后端返回日期字符串 "2024-06-15T12:34:56Z",想自动转成 Date 对象;或遇到 null 字段想默认填空字符串。这时不该 monkey patch JSON.parse,而应:
- 用
JSON.parse(str, (key, value) => { ... })的 reviver 参数做类型修复 - 对
undefined字段做 fallback,应在业务层处理,而非试图让JSON.stringify输出undefined - 需序列化
Date、Map、Set等类型时,必须手动在replacer中转换,例如:JSON.stringify(new Date(), (k, v) => v instanceof Date ? v.toISOString() : v)
真正容易被忽略的是:JSON 规范不定义时间、二进制、大数(BigInt)的表示方式,这些都得靠业务协议约定,不能指望解析器自动理解。










