JSON.parse要求严格双引号、无单引号、键名必须引号、换行需转义;仅接受字符串,否则TypeError;须用try...catch捕获SyntaxError;reviver可转换类型但慎用;JSON.parse(JSON.stringify(obj))不能替代深拷贝。

JSON 字符串必须是严格格式,否则 JSON.parse 会直接抛出 SyntaxError —— 这不是“解析失败”,而是语法不合法,根本不会进入逻辑处理阶段。
JSON.parse 基本用法与常见报错
JSON.parse 只接受字符串输入,传入对象、null、数字或 undefined 都会立即报 TypeError。最常踩的坑是误把已解析的对象再 parse 一次:
const data = { "name": "Alice" };
JSON.parse(data); // TypeError: Cannot parse object另一个高频错误是字符串里混用了单引号或未转义的换行:
-
"{'name': 'Bob'}"→ 单引号非法,JSON 只认双引号 -
"{name: 'Bob'}"→ 键名没加引号,非法 -
"{\n"name": "Bob"}"→ 换行未转义,SyntaxError
如何安全地解析并捕获错误
永远不要裸调 JSON.parse。真实场景中,输入可能来自用户输入、localStorage、fetch 响应体等不可信源,必须包裹 try...catch:
立即学习“Java免费学习笔记(深入)”;
function safeParse(jsonStr) {
try {
return JSON.parse(jsonStr);
} catch (err) {
if (err instanceof SyntaxError) {
console.error("JSON 格式错误:", err.message);
return null;
}
throw err;
}
}注意:不要只检查 err.name === "SyntaxError",用 instanceof 更可靠;也不要忽略其他可能异常(如内存溢出),但绝大多数情况就是 SyntaxError。
reviver 参数的实用场景
JSON.parse 的第二个参数 reviver 是个函数,能在解析过程中逐层修改值,适合做类型转换或过滤:
const json = '{"date":"2023-10-05","count":42}';
const obj = JSON.parse(json, (key, value) => {
if (key === "date") return new Date(value);
if (key === "count" && typeof value === "number") return value * 2;
return value;
});
// obj.date 是 Date 实例,obj.count 是 84注意:reviver 会遍历每个键值对(包括嵌套对象),返回 undefined 会删除该属性;如果对性能敏感(比如解析 MB 级 JSON),避免在 reviver 中做重操作。
和 JSON.stringify 的配对陷阱
JSON.parse(JSON.stringify(obj)) 常被误用作“深拷贝”,但它会丢失:
-
Date、RegExp、undefined、Function、Symbol -
NaN和Infinity被转为null - 循环引用直接抛错
如果只是想序列化后立刻解析回来,确保原始数据只含 JSON 安全类型(string/number/boolean/null/object/array)。否则,该用 structuredClone(现代浏览器)或专用深拷贝库。











