报错只说 Unexpected token 时,你面对的是几千行文本。定位靠三样东西:行号、列号,以及该位置前后 40 个字符。把中间这 80 来个字符当成现场照片看,多数错误一眼就能认出病因——因为真正写错的东西通常不在这个位置的右边,就在它的左边一格。
先分清报错位置指什么
列号指向的是解析器读不下去的那个字符,不是写错的字符本身。所以看那 40 个字符时,重点检查报错点前面紧邻的符号:少一个逗号、上一个值没收尾、引号没闭合,报错都会往后挪一位。这是新手手改越改越错的原因——一直盯着箭头指的那位删。
行号还有一个用途:判断内容有没有被截断。日志里连续输出两个对象、复制时没选全,报错常落在最后一行末尾,看着像语法正确却过不去。这时对照统计项里的键名总数和字符串数量,跟预期差一截就是掉了一段,回去拿全量比修文件有用。
四类会被主动扫出来的写法
结尾多余逗号。 最后一个键值对或数组末项后面多一个逗号。JS 允许,JSON 禁止,从代码里拷出来的配置最常犯。
单引号字符串。 键名和值都必须用双引号包。Python 打印出来的字典、前端代码里的对象字面量,几乎都是单引号。
注释。 双斜杠行注释和斜杠星块注释都不是 JSON 的一部分。带注释的配置文件属于 JSONC,这一页不支持 JSON5 与 JSONC,只能先把注释删净。
NaN 与 undefined。 它们是脚本语言的值,不是合法 JSON 字面量,必须改成 null 或真数字。程序序列化没配好就会吐出这两个词。
这四类站内会在报错后单独列出来,不用你自己猜。
扫描查不到的三类坑
字符串里有真换行。 从聊天窗口或 Word 复制的多行内容,每行都是一个非法字符,必须写成反斜杠加 n 的转义序列。扫描不会报它,只会让报错一路漂到行尾。
中文引号混进键名。 视觉上和普通引号几乎一样,只有那 40 个字符放大后能看出来。
文件开头带 BOM。 表现为报错在第一位却看不到任何异常字符。可以用 TXT处理 识别并去掉。
建议的操作顺序
- 粘进 JSON 格式化,记下行列号,读前后 40 个字符。
- 看附加扫描结论是否命中四类之一,命中就照改,不要顺手改别处。
- 没命中就往报错点左边找:引号配对、逗号、真换行。
- 改完重新解析,成功后再看统计四项确认数据条数没错。
什么时候别用它:你要校验的是字段结构而不是语法,这里给不了答案——本站不做 JSON Schema 校验,只检查语法是否合法,YAML 与 XML 输入也不接受。整个过程在浏览器本地完成,敏感配置不会被上传,也不需要登录。更多排查顺序可参考 JSON 解析错误修复。