JSON 错误如何定位到行和列

调试接口时,最烦的就是 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));

方法三:二分法缩小范围

没有工具、不想写代码时,还有个土办法——二分排查:

  1. 把 JSON 对半删掉,看哪一半报错。
  2. 对报错的那一半继续对半删。
  3. 反复几次,就能锁定出错的那一小段。

这个方法虽然慢,但在没有工具的环境里很有效。

常见错误位置一览

不同报错往往对应不同的错误类型,先看报错信息能帮你更快定位:

报错信息 常见原因
Unexpected token } 多了一个右括号/右花括号
Unexpected end of JSON input 少了一个闭合括号
Unexpected token , 尾逗号
Unexpected string 引号不匹配
Unexpected token ' 用了单引号

延伸阅读