最常用且有效的方式是用 try...catch 包裹 JSON.parse() 来捕获非标准 JSON 解析错误,因 JavaScript 仅支持严格 RFC 7159 格式,任何单引号、尾逗号等均抛 SyntaxError。

直接用 try...catch 包裹 JSON.parse() 是捕获非标准 JSON 解析错误的最常用且有效方式。关键在于:JavaScript 原生只接受严格符合 RFC 7159 的 JSON 字符串,任何单引号、尾逗号、注释、undefined、NaN、函数等都会抛出 SyntaxError,而 try...catch 正好能捕获这类异常。
基础 TryCatch 写法(必须)
这是最简也最可靠的结构,catch 中拿到的是原生 SyntaxError 实例,包含 message 和 lineNumber(部分环境支持)等信息:
- 始终把
JSON.parse(str)放在try块内,不能提前执行 -
catch参数推荐命名为err或e,避免覆盖全局error - 不要只依赖
err.message.includes("JSON")判断——有些环境(如旧版 Safari)报错信息不固定,应优先检查err instanceof SyntaxError
安全解析函数封装(推荐)
把校验逻辑收拢成一个可复用函数,返回 null 或默认值更利于业务处理:
function safeParse(jsonStr, defaultValue = null) {
try {
return JSON.parse(jsonStr);
} catch (err) {
if (err instanceof SyntaxError) {
console.warn("JSON 解析失败:", err.message, "输入:", jsonStr);
return defaultValue;
}
throw err; // 非 SyntaxError 不吞掉(比如内存溢出等)
}
}调用示例:safeParse('{"name": "Alice",}') // → null(尾逗号非法)
立即学习“Java免费学习笔记(深入)”;
识别常见非标格式并预处理(按需)
如果后端返回的是“类 JSON”(如单引号、尾逗号),可在 parse 前做轻量清洗,但要注意安全边界:
- 仅对已知可控来源(如内部配置、调试输出)做替换;生产环境不建议自动修正用户输入
- 单引号 → 双引号:用正则需谨慎,
str.replace(/'/g, '"')可能误换字符串内容里的单引号,更稳妥是用JSON5.parse()或eval(不推荐) - 尾逗号、注释:标准 JSON 不支持,可引入 JSON5 库替代:
JSON5.parse(str)兼容更多宽松语法
错误定位与调试技巧
当报错信息不够明确时,可辅助定位问题位置:
- 打印出错字符串的前后 20 个字符:
console.log("附近内容:", jsonStr.slice(err?.columnNumber - 10, err?.columnNumber + 10)) - 用在线工具(如 JSONLint)粘贴原始字符串验证
- 注意隐藏字符:
\u2028(行分隔符)、\u2029(段落分隔符)在 JSON 中非法,但肉眼不可见
不复杂但容易忽略:真正的非标 JSON 错误只能靠 try...catch 捕获,没有其他内置 API 可绕过语法校验。写业务时养成包裹习惯,比事后 debug 快得多。


















