Unexpected token 这个报错,前端后端都见过。它只告诉你位置,不告诉你原因。

下面六种,覆盖了大部分情况。

一、单引号

{'name': 'x'} 在 JavaScript 里合法,在 JSON 里非法。JSON 只认双引号。

从代码里复制对象字面量当 JSON 用,最容易踩这个。

二、尾逗号

{"a": 1, "b": 2,} 最后一个逗号是多余的。JS 允许,JSON 不允许。

数组同理,[1, 2, 3,] 也是错的。

三、注释

// 说明 和 /* 说明 */ 都不合法。

有些配置文件支持注释,那是 JSONC 或 JSON5,不是标准 JSON。用标准解析器读带注释的文件,一定报错。

四、键没加引号

{name: "x"} 是 JS 对象写法。JSON 要求键必须是双引号字符串。

五、转义问题

字符串里直接出现双引号、反斜杠、真实换行,都会破坏结构。

比如从 Excel 复制的多行文本,里面带真实换行,贴进 JSON 就废了。要转成 \n。

六、BOM 头

Windows 记事本保存 UTF-8 时可能加一个不可见的 BOM。人眼看不出,解析器会报“意外的字符”。

用编辑器的“以 UTF-8 无 BOM 保存”,或者用命令行去掉。

怎么快速定位

报错一般带行号和列号,但压缩过的 JSON 只有一行,列号可能几千。

把文本贴进 JSON 格式化工具,它会指出错误位置并尝试格式化。能看到结构,问题基本就露出来了。

改完再校验一次,别凭感觉判断“应该好了”。