常见报错与校验
这是什么:排错 = 看懂 JSON.parse 的报错信息,快速定位「到底是哪个字符不合法」,并用 try...catch 保证解析失败时程序不崩。
为什么用:接口数据、手写配置总有翻车的时候;parse 的报错只给一个位置不给行号,不懂套路的新手会卡很久。学完这章,三大坑你一眼就能认出来。
如何用:先认识三大坑的报错长相,再学「安全解析」的标准写法,最后记住两件排错工具。
三大坑之一:尾逗号
JSON.parse('{ "a": 1, "b": 2, }')
完整报错:
SyntaxError: Unexpected token } in JSON at position 18
逐位分析:位置 18 就是最后那个 } 前面的逗号。解析器读完 2 正等下一个「键」,结果等来了 }——它就报「这里不该出现 }」。看到 Unexpected token },先查前面有没有多写的逗号。
三大坑之二:单引号
JSON.parse("{ 'name': '呱小吉' }")
完整报错:
SyntaxError: Unexpected token ' in JSON at position 2
逐位分析:位置 2 是键名前的单引号。JSON 只认双引号,单引号第一个字符就被判违法。记住:从 JS 对象复制数据到 JSON 时,所有引号都要换成双引号。
三大坑之三:注释
JSON.parse('{ "a": 1 /* 临时数据 */ }')
完整报错:
SyntaxError: Unexpected token / in JSON at position 11
逐位分析:位置 11 是 /* 的斜杠。JSON 没有注释语法,斜杠一出现就违法。想留说明就写成键值对:{ "a": 1, "note": "临时数据" }。
报错信息怎么读
Unexpected token X in JSON at position N 的公式:
| 部分 | 含义 |
|---|---|
token X |
遇到了不该出现的字符 X(}、'、/、u……) |
position N |
这个字符在字符串里的第 N 个位置(从 0 数) |
另一个常见报错 Unexpected end of JSON input 则是「字符串读到头了还没读完」——多半是少了闭合的 } 或 ],或者数据被截断了。
技巧:把报错的
position数字拿出来,在字符串里数到那个位置看看是什么字符,坑基本就在它附近。
安全校验:try...catch 兜底
解析来路不明的数据(服务器返回、用户输入、localStorage 里的旧数据),一定要包一层 try...catch:
function safeParse(text, fallback) {
try {
return JSON.parse(text)
} catch (e) {
console.warn('JSON 解析失败:', e.message)
return fallback // 给个兜底默认值,程序继续跑
}
}
let data = safeParse('{ bad json }', {})
let saved = safeParse(localStorage.getItem('todos'), [])
「你会看到」:非法数据不再让程序崩溃,而是拿到 fallback 默认值 + 一条警告。解析结果还要再验一层:确认关键字段存在再用,比如 data.user?.name(可选链见第 4 章)。
两件排错工具
- 格式化肉眼查:把 JSON 贴进 VS Code(自动高亮报错)或浏览器控制台跑一次
JSON.parse,看 position 定位 - stringify 反向验证:能被
parse的数据用JSON.stringify(data, null, 2)打印出来,缩进排版后缺个逗号、多个括号一目了然
记忆口诀:token 是凶手,position 是案发地;尾逗单引号注释,三大坑记心里。
📝 本章小结
- 三大坑:尾逗号(
Unexpected token })、单引号(Unexpected token ')、注释(Unexpected token /) - 报错公式:
Unexpected token X in JSON at position N,X 是凶手、N 是案发位置 Unexpected end of JSON input= 括号没闭合或数据被截断- 来路不明的数据用
try...catch+ 兜底值 + 字段校验三重保险
动手改
- 把第 2 章你写的名片 JSON 故意加一处尾逗号,看报错的 position 是多少
- 写一个
safeParse,分别喂给它合法和非法字符串试试 - 把一条真实网站接口的返回(F12 → Network)贴进控制台
JSON.parse验证