最常用、最安全的方式是使用 json.parse() 解析标准 json 字符串;非标准情况需预处理或用 json5 等库;禁用 eval 和 function;特殊类型需自定义 reviver 恢复。

JavaScript 中从字符串解析出复杂数据类型,最常用、最安全的方式是使用 JSON.parse(),但前提是该字符串是合法的 JSON 格式。如果字符串不是标准 JSON(比如含单引号、函数、undefined、注释、变量引用等),则不能直接用 JSON.parse(),需根据具体情况选择合适方法。
✅ 使用 JSON.parse() 解析标准 JSON 字符串
这是最推荐的方式,适用于服务器返回、localStorage 存储、配置文件等场景中符合 JSON 规范的字符串。
- 字符串必须使用双引号包裹键名和字符串值,不能用单引号
- 不支持
undefined、function、Symbol、BigInt、正则表达式字面量等原生 JS 类型 - 建议始终配合
try...catch捕获解析失败
示例:
const str = '{"name":"Alice","age":30,"hobbies":["reading","coding"]}';const obj = JSON.parse(str); // → { name: "Alice", age: 30, hobbies: ["reading","coding"] }
⚠️ 避免使用 eval() 或 Function() 构造函数
虽然 eval('({ a: 1, b: [2,3] })') 或 new Function('return ' + str)() 能解析更“JS 风格”的字符串(如单引号、省略引号的键),但存在严重风险:
- 执行任意代码,极易引发 XSS 或逻辑漏洞
- 无法限制作用域,可能污染全局环境
- 性能差、调试困难、不符合现代工程规范
除非在完全可控、无外部输入的本地调试场景,否则应禁止使用。
? 处理非标准字符串:预处理 + JSON.parse
当字符串接近 JSON 但有小差异(如单引号、末尾逗号、注释)时,可先做轻量预处理再解析:
- 单引号 → 双引号(需谨慎,避免替换字符串内部的单引号)
- 去除行内注释(
// ...和/* ... */) - 移除尾随逗号(JSON 不允许对象/数组末尾有逗号)
推荐使用成熟库如 JSON5(支持注释、单引号、尾随逗号等):
import JSON5 from 'json5';const obj = JSON5.parse("{'name': 'Bob', /* age is optional */}");
? 特殊场景:反序列化带函数/正则/日期的字符串
JSON 本身不保存类型信息,若需还原 Date、RegExp、Map、Set 或函数,需约定序列化规则,并在解析时手动恢复:
- 序列化时将特殊值转为带标记的对象,例如:
{ "$date": "2024-01-01T00:00:00Z" } - 使用
JSON.parse(str, reviver)的第二个参数(reviver 函数)识别并重建实例 - 也可借助
serialize-javascript(服务端)或devalue(Svelte 生态)等专用序列化库
示例(恢复 Date):
const str = '{"created":{"$date":"2024-01-01T00:00:00Z"}}';const obj = JSON.parse(str, (k, v) => {
if (v && typeof v === 'object' && v.$date) return new Date(v.$date);
return v;
});
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











