JSON.parse()
和JSON.stringify()
的区别
在 JavaScript 中,JSON.parse()
和 JSON.stringify()
是处理 JSON 数据的两个核心方法,它们的功能恰好相反,分别用于 JSON 字符串与 JavaScript 对象之间的转换。以下是两者的详细区别:
1. 功能本质不同
-
JSON.parse()
:将JSON 格式的字符串 解析为JavaScript 对象 (或数组、基本类型值)。简单说,就是把"文本形式的 JSON 数据"变成程序可以直接操作的 JavaScript 数据结构。
示例:
javascriptconst jsonStr = '{"name":"Alice","age":25}'; const obj = JSON.parse(jsonStr); // 转换为对象:{ name: "Alice", age: 25 }
-
JSON.stringify()
:将JavaScript 对象 (或数组、基本类型值)转换为JSON 格式的字符串 。作用是把程序中的数据转换成可传输、可存储的文本格式(JSON 字符串)。
示例:
javascriptconst obj = { name: "Bob", age: 30 }; const jsonStr = JSON.stringify(obj); // 转换为字符串:'{"name":"Bob","age":30}'
2. 应用场景不同
-
JSON.parse()
的典型场景:- 解析从服务器接收到的 JSON 格式响应数据(如 AJAX 请求返回的字符串)。
- 读取本地存储(
localStorage
/sessionStorage
)中保存的 JSON 字符串,还原为对象供程序使用。
-
JSON.stringify()
的典型场景:- 将 JavaScript 数据转换为 JSON 字符串,通过网络发送给服务器(如接口请求参数)。
- 将数据以 JSON 字符串形式存入本地存储(因为本地存储只能保存字符串)。
- 简单克隆对象(浅克隆,有局限性)或格式化数据用于打印。
3. 参数与额外功能不同
两者都支持额外参数,实现更灵活的转换:
-
JSON.parse(text, reviver)
:第二个参数
reviver
是一个函数,用于在解析过程中修改结果。例如,将日期字符串转换为Date
对象:javascriptconst jsonStr = '{"name":"Charlie","birth":"2000-01-01"}'; const obj = JSON.parse(jsonStr, (key, value) => { if (key === 'birth') return new Date(value); // 转换为Date对象 return value; }); // 结果:{ name: "Charlie", birth: Date对象 }
-
JSON.stringify(value, replacer, space)
:replacer
:函数或数组,用于过滤/修改要转换的属性(如排除敏感字段)。space
:数字或字符串,用于格式化输出的 JSON 字符串(增加缩进,便于阅读)。
示例:
javascriptconst obj = { name: "Dave", age: 35, password: "123" }; // 过滤掉password,并缩进2个空格 const jsonStr = JSON.stringify(obj, ['name', 'age'], 2); /* 结果: { "name": "Dave", "age": 35 } */
4. 注意事项
-
JSON.parse()
需注意格式合法性 :如果输入的字符串不是有效的 JSON 格式(如缺少引号、使用单引号等),会抛出SyntaxError
。例如:
JSON.parse('{name: "Alice"}')
会报错(属性名必须用双引号)。 -
JSON.stringify()
的限制:- 无法转换函数、
undefined
、Symbol
类型的属性(会被忽略)。 - 循环引用的对象会导致报错(如
obj.self = obj
)。 Date
对象会被转换为 ISO 格式字符串(解析时需手动转回Date
)。
- 无法转换函数、
总结对比表
特性 | JSON.parse() |
JSON.stringify() |
---|---|---|
核心功能 | JSON字符串 → JavaScript对象 | JavaScript对象 → JSON字符串 |
典型用途 | 解析网络响应、读取本地存储数据 | 发送数据到服务器、存储数据到本地 |
输入类型 | 符合JSON格式的字符串 | JavaScript对象/数组/基本类型 |
输出类型 | JavaScript对象/数组/基本类型 | JSON格式的字符串 |
特殊参数 | 支持reviver 函数修改解析结果 |
支持replacer 过滤属性、space 格式化输出 |
简言之,JSON.parse()
是"读"操作(将字符串还原为数据),JSON.stringify()
是"写"操作(将数据转换为字符串),二者共同实现了 JSON 数据的解析与序列化。