有一种诡异的 JSON 报错:文件用肉眼看完全正常,但 JSON.parse 偏偏报 Unexpected token at position 0。这种「看不见的错误」,元凶往往是文件开头的 BOM 隐藏字符。
BOM(Byte Order Mark,字节序标记)是一个藏在文件最开头的不可见字符 U+FEFF。它的本意是标记文件的字节序,但 UTF-8 编码根本不需要它。问题是:Windows 上一些旧版编辑器(尤其是记事本)保存 UTF-8 文件时,会偷偷在开头加一个 BOM。
这个字符肉眼看不见,但会被 JSON 解析器读到,于是报错位置是 position 0——也就是最开头那个「看不见」的字符。
JSON.parse(bomJson);
// SyntaxError: Unexpected token in JSON at position 0
注意 token 后面是空的,不是 token , 或 token {,因为那个字符本身就是不可见的。
看报错位置:如果是 position 0,且文件看起来明明合法,几乎可以断定是 BOM。也可以用代码检测:
const hasBOM = str.charCodeAt(0) === 0xFEFF;
console.log(hasBOM ? '有 BOM' : '无 BOM');
方法一:编辑器另存为「UTF-8 无 BOM」
用 VSCode、Sublime、Notepad++ 等编辑器打开文件,另存为时把编码选成 UTF-8(无 BOM),保存即可。这是最推荐的做法。
方法二:代码里去掉
const clean = str.replace(/^\uFEFF/, '');
JSON.parse(clean);
如果报错位置不是 0,或者你无法确定是不是 BOM,直接把内容粘进 JSON 在线校验工具——它会精确定位到错误所在的行和列,并给出原因,比手动排查快得多。