JavaScript 中 JSON 序列化与解析依赖原生的 JSON.stringify() 和 JSON.parse():前者将可序列化值转为字符串(忽略函数/undefined/Symbol,Date 转 ISO,循环引用报错),后者严格解析双引号、无尾逗号的字符串,需 try...catch 防错。

JavaScript 中 JSON 数据的序列化和解析,靠的是两个原生方法:JSON.stringify() 和 JSON.parse()。它们不依赖任何库,浏览器和 Node.js 全都支持,但用法有明确边界——不是所有 JS 值都能直接转,也不是所有字符串都能直接解析。
JSON.stringify():把 JS 值变成 JSON 字符串
它只处理可序列化的值:字符串、数字、布尔值、null、数组、普通对象(自有可枚举属性)。其他类型会被忽略或替换:
- 函数、undefined、Symbol → 整个键值对被跳过(对象中)或转为 null(数组中)
- Date 对象 → 自动调用
.toJSON(),转成 ISO 格式字符串,如"2026-07-07T04:51:00.000Z" - NaN、Infinity → 转为
null - 循环引用 → 直接抛错
TypeError: Converting circular structure to JSON
常用参数组合:
-
JSON.stringify(obj):紧凑输出,无空格 -
JSON.stringify(obj, null, 2):缩进 2 空格,便于调试 -
JSON.stringify(obj, ['id', 'name']):只保留指定字段 -
JSON.stringify(obj, (k, v) => k === 'date' ? new Date(v).toISOString() : v):用 replacer 函数定制转换逻辑
JSON.parse():把 JSON 字符串变成 JS 值
它只接受严格符合 JSON 语法的字符串——不是 JS 对象字面量,也不是带单引号或尾逗号的“近似体”:
立即学习“Java免费学习笔记(深入)”;
- 键名和字符串值必须用双引号,
{"name": "Tom"}✅,{'name': 'Tom'}❌ - 不能有尾逗号,
{"a": 1,}❌ - 不能出现
undefined、function、注释等 JS 特有语法 - 输入必须是字符串,传入对象、null 或 undefined 会直接报错
安全使用建议:
- 始终用
try...catch包裹,尤其处理 fetch 响应、用户输入或配置文件时 - 可选第二个参数
reviver函数,在解析过程中逐层处理值,例如自动把时间字符串转为 Date 实例 - 简单校验:先
typeof str === 'string' && str.trim(),再解析
常见场景与注意事项
实际开发中容易忽略的关键点:
- fetch 获取 JSON 数据,应调用
response.json()(它内部已用JSON.parse()),而不是手动response.text().then(JSON.parse) - JSON 不是 JS 对象,
{name: "Alice"}是对象字面量,'{"name":"Alice"}'才是 JSON 字符串 - 深拷贝可用
JSON.parse(JSON.stringify(obj)),但会丢失 Date、RegExp、Map、Set、函数等类型 - 需要保留特殊类型时,必须配合
replacer和reviver手动处理,或改用structuredClone()(现代环境)


















