🐸 青蛙编程网
首页 / 前端 / JSON / 5. 常见报错与校验

常见报错与校验

这是什么:排错 = 看懂 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 章)。

两件排错工具

  1. 格式化肉眼查:把 JSON 贴进 VS Code(自动高亮报错)或浏览器控制台跑一次 JSON.parse,看 position 定位
  2. 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 + 兜底值 + 字段校验三重保险

动手改

  1. 把第 2 章你写的名片 JSON 故意加一处尾逗号,看报错的 position 是多少
  2. 写一个 safeParse,分别喂给它合法和非法字符串试试
  3. 把一条真实网站接口的返回(F12 → Network)贴进控制台 JSON.parse 验证

上一章:嵌套对象与数组 · 下一章:综合练习 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。