调试接口时,最烦的就是 JSON 格式报错却不知道错在哪。JavaScript 的 JSON.parse 抛错时通常只给一个 position 数字,比如 position 82,可你面对的是一大段 JSON,根本不知道第几行第几列。本文教你三种定位方法。
看一个典型报错:
SyntaxError: Unexpected token } in JSON at position 82
这里的 position 82 指的是第 82 个字符(从 0 开始数),不是行号。如果你的 JSON 是压缩成一行的大字符串,那 82 就是列位置;如果 JSON 有换行,就需要手动换算。
把 JSON 粘贴到 JSON 在线校验工具,它会自动定位到错误所在的行和列,并给出原因提示。例如它会明确告诉你:
错误位置:第 8 行 第 15 列,原因:多余的逗号
这比自己数字符快得多,尤其适合排查接口返回的长 JSON。
如果你只能用命令行,可以用这段代码把 position 换成行号列号:
function locate(text, pos) {
const before = text.slice(0, pos);
const line = before.split('\n').length;
const col = pos - before.lastIndexOf('\n');
return `第 ${line} 行 第 ${col} 列`;
}
const err = '...'; // JSON.parse 抛出的错误
console.log(locate(jsonText, 82));
没有工具、不想写代码时,还有个土办法——二分排查:
这个方法虽然慢,但在没有工具的环境里很有效。
不同报错往往对应不同的错误类型,先看报错信息能帮你更快定位:
| 报错信息 | 常见原因 |
|---|---|
Unexpected token } |
多了一个右括号/右花括号 |
Unexpected end of JSON input |
少了一个闭合括号 |
Unexpected token , |
尾逗号 |
Unexpected string |
引号不匹配 |
Unexpected token ' |
用了单引号 |