json.parse() 解析失败抛 syntaxerror,须用 try...catch 捕获;推荐用 err instanceof syntaxerror 判断,封装 safeparse 函数返回默认值,并预先校验输入是否为非空字符串。

JSON.parse() 解析失败时会抛出 SyntaxError,必须用 try...catch 捕获,否则会导致脚本中断。关键在于:错误对象的 message 属性通常包含具体错误位置(如“Unexpected token”),但不能直接依赖其格式做逻辑判断;更可靠的方式是检查错误类型,并结合 fallback 处理。
基础用法:捕获并识别解析失败
最简方式是包裹 JSON.parse() 调用,捕获异常后做统一处理:
- 使用
catch (err)接收错误对象,err instanceof SyntaxError可准确判断是否为 JSON 解析错误 - 不要仅靠
typeof err === 'object'或err.message.includes('JSON')判断,因为其他错误也可能含类似文字 - 示例:
<script><br> try {<br> const data = JSON.parse('{ "name": "Alice", "age": }'); // 缺少值,语法错误<br> } catch (err) {<br> if (err instanceof SyntaxError) {<br> console.error('JSON 格式错误:', err.message);<br> } else {<br> console.error('其他错误:', err);<br> }<br> }<br> </script>
安全解析函数:返回默认值或 null
实际项目中常封装一个健壮的解析函数,避免每次手动写 try catch:
- 接受字符串和可选的默认值(如
null、空对象{}或数组[]) - 解析成功返回结果,失败则静默返回默认值,不抛错也不打断流程
- 示例:
function safeParse(jsonStr, defaultValue = null) {
try {
return JSON.parse(jsonStr);
} catch (err) {
return defaultValue;
}
}
const user = safeParse('{"name":"Bob"}', {}); // { name: "Bob" }
const invalid = safeParse('{ "id": ', []); // []
调试辅助:定位错误位置(谨慎使用)
SyntaxError 的 message 字段有时含行号和列号(如 Chrome 中显示 “Unexpected end of JSON input at position 12”),可用于日志记录,但注意:
- 不同浏览器提示格式不一致(Firefox 不带 position,Safari 表述略有差异),不可用于条件分支
- 若需精准定位,可配合正则粗略提取位置信息(仅限开发环境辅助):
const posMatch = err.message.match(/position\s+(\d+)/i);
const position = posMatch ? parseInt(posMatch[1], 10) : null; - 生产环境建议只记录
err.message和原始字符串前 100 字符,避免敏感数据泄露
进阶:处理非字符串输入与空值
JSON.parse() 本身只接受字符串,传入 null、undefined 或数字会直接报 TypeError,不属于 SyntaxError:
- 应在调用前校验输入类型:
typeof jsonStr === 'string' && jsonStr.trim() !== '' - 或者在
catch中同时处理SyntaxError和TypeError:
try {
return JSON.parse(jsonStr);
} catch (err) {
if (err instanceof SyntaxError || err instanceof TypeError) {
return defaultValue;
}
throw err; // 其他错误仍向上抛
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











