JSON通过JSON.parse()和JSON.stringify()实现安全、标准的字符串与对象互转,因轻量、语言无关、结构清晰及全平台原生支持成为跨系统数据交换事实标准,但不支持Date、函数、循环引用等JavaScript特有类型。

JavaScript 中的 JSON 通过 JSON.parse() 解析字符串为对象,用 JSON.stringify() 将对象转为字符串;它成为通用数据格式,是因为轻量、语言无关、结构清晰且被所有主流平台原生支持。
JSON.parse():安全地把字符串变成 JavaScript 值
该方法将符合 JSON 格式的字符串转换为对应的 JavaScript 值(对象、数组、字符串、数字、布尔值或 null)。它严格校验语法,遇到非法格式(如单引号、尾逗号、undefined)会直接抛错,避免静默失败。
- 只接受双引号包裹的属性名和字符串值,例如:
{"name": "Alice", "age": 30} - 可传入第二个参数
reviver函数,在解析过程中对每个键值对做处理,比如过滤字段或转换日期字符串 - 不执行代码,比
eval()安全得多——这是它被广泛采用的关键原因之一
JSON.stringify():把 JavaScript 值变成标准字符串
该方法将 JavaScript 值序列化为 JSON 字符串。它会忽略函数、undefined、Symbol 类型,也会跳过对象中值为 undefined 的属性。
- 支持第三个参数用于美化输出(空格数或自定义缩进字符串),便于调试
- 第二个参数可以是数组(指定需要序列化的属性名)或 replacer 函数(控制每个值的输出形式)
- 遇到循环引用会报错,需提前处理(如用 Map 记录已遍历对象,或使用结构化克隆替代)
为什么 JSON 成为跨系统数据交换的事实标准
不是因为它功能最强,而是它在“够用”和“普适”之间找到了极佳平衡点。
立即学习“Java免费学习笔记(深入)”;
- 语法简单明确:只有六种原始类型和两种组合结构(对象/数组),没有复杂概念(如原型、方法、正则字面量)
- 纯文本、无状态、无执行逻辑,天然适合网络传输与存储,防火墙和代理通常允许 JSON 流量
- 几乎所有编程语言都内置或有成熟库支持 JSON 解析/生成,服务端(Python、Java、Go)、客户端(JS、Swift、Kotlin)无缝对接
- HTTP API 默认载体:RESTful 接口普遍以
Content-Type: application/json通信,浏览器 fetch 和 XMLHttpRequest 原生配合良好
注意边界:JSON 不是万能的 JavaScript 序列化方案
它设计目标是数据交换,不是完整状态保存。以下内容无法直接表示:
- Date 对象 → 变成 ISO 字符串,需手动 new Date() 恢复
- RegExp、Map、Set、BigInt、TypedArray 等类型 → 会被忽略或转为 null/{},需额外约定编码规则
- 函数、undefined、NaN、Infinity → 在 stringify 阶段丢失或报错
- 循环引用 → 直接抛出 TypeError,需业务层预处理或改用 structuredClone(仅现代环境)











