必须用 try...catch,因为 JSON.parse() 遇非法格式会立即抛出 SyntaxError,不捕获将导致脚本中断;它不会返回 null 或静默失败,仅接受标准双引号 JSON 字符串。

JSON 解析出错时,用 try...catch 是最直接、最可靠的方式——因为 JSON.parse() 在遇到非法格式时会**立即抛出语法错误(SyntaxError)**,不 catch 就会导致脚本中断。
为什么必须用 try catch?
JSON.parse() 不会返回 null 或 undefined,也不会静默失败。只要字符串不符合 JSON 语法(比如多了一个逗号、用了单引号、缺少引号、有注释等),它就会 throw 一个 SyntaxError 异常。不捕获就崩。
标准写法:包裹 parse 并捕获 SyntaxError
这是最常见也最稳妥的处理方式:
function safeParse(jsonStr) {
try {
return JSON.parse(jsonStr);
} catch (err) {
if (err instanceof SyntaxError) {
console.error('JSON 格式错误:', err.message);
return null; // 或返回默认值、空对象等
}
throw err; // 其他错误不吞,继续上抛
}
}
// 使用示例
const data = safeParse('{"name": "Alice", "age": 30,}'); // 多余逗号 → 报错
console.log(data); // null
常见错误场景和对应修复建议
-
单引号代替双引号:JSON 规范只认双引号。如
{'name': 'Tom'}会报错 → 改为{"name": "Tom"} -
尾部逗号:如
{"a": 1, "b": 2,}→ 删除最后一个逗号 - undefined / NaN / 函数 / 注释:这些在 JSON 中非法 → 确保后端返回的是标准 JSON 字符串,不要前端拼接
-
响应体不是纯 JSON:比如服务端返回了 HTML 错误页或带 BOM 的 UTF-8 字符串 → 检查
response.headers.get('content-type'),必要时先trim()或正则清理
配合 fetch 使用时的完整防护
网络请求中解析 JSON 更容易出问题,建议分层处理:
立即学习“Java免费学习笔记(深入)”;
async function fetchUserData(url) {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const text = await res.text(); // 先取原始文本,避免自动解析失败
const data = JSON.parse(text); // 再手动 parse,可捕获 SyntaxError
return data;
} catch (err) {
if (err instanceof SyntaxError) {
console.error('JSON 解析失败,原始内容:', text?.slice(0, 100));
throw new Error('服务器返回了非 JSON 数据');
}
throw err;
}
}


















