JSON 语法规则与常见错误
JSON 的语法本身很小,一个引号或逗号写错,整段文本就无法解析。 下面先说清 JSON 允许什么,再逐条看最高频的几类「JSON 语法错误」, 最后演示怎么把报错定位到具体的行号与列号。
一、JSON 只支持六种数据类型
无论结构多复杂,JSON 的值最终都由下面六种类型组成(RFC 8259):
- 对象 object:花括号
{ },由键值对组成,键必须是字符串。 - 数组 array:方括号
[ ],元素类型可不同。 - 字符串 string:必须用 英文双引号 " " 包裹。
- 数字 number:整数或浮点,不支持
NaN、Infinity、前导零(0123)与十六进制。 - 布尔 boolean:只能是
true或false。 - 空值 null:小写
null。
而 JSON 里 没有 undefined、函数、注释、单引号字符串,也没有尾随逗号。 很多「JSON 报错」其实是把它当成 JavaScript 对象字面量来写了。
二、三条最容易被违反的硬规则
1. 键名与字符串必须用双引号
裸键名(不带引号)和单引号在 JavaScript 里合法,在 JSON 里都不合法:
错误写法
{name: "Tom"}
{'name': 'Tom'}正确写法
{"name": "Tom"} 校验时工具会给出中文提示,例如「属性名必须用双引号包裹,不能用单引号或裸 key」, 期望 token 显示为 "键名"。
2. 禁止尾随逗号(trailing comma)
对象或数组的最后一个元素后面不能有多余的逗号。 这是从 JavaScript / TypeScript 迁移过来时最高频的错误:
错误写法
{
"name": "Tom",
}正确写法
{
"name": "Tom"
}对应提示为「此处不应出现 },可能是多余的右花括号,或上一项缺少逗号」。
3. 整份文本只能有一个根元素
把多个对象直接并列会触发「JSON 主体已结束但仍有多余字符」;多条数据应当用数组包裹:
错误写法
{"id": 1}
{"id": 2}正确写法
[{"id": 1}, {"id": 2}]三、其他高频错误
- 缺少逗号或逗号多余。 相邻键值对之间漏写逗号会提示「此处期望属性名或 },可能是上一项缺少逗号」,连续两个逗号则提示「此处不应出现逗号」。
- 冒号写反或写漏。
"a" 1这类会提示「属性名后面期望 :」。 - 字符串里含未转义的控制字符。 字符串内部直接换行、制表符是不允许的,必须写成
\n、\t等转义序列,否则提示「包含未转义的控制字符」。 - 括号或引号未闭合。 少写一个
}、]或引号,会得到「JSON 提前结束,可能是括号、引号或花括号未闭合」。 - 数字格式不合法。 前导零、多个小数点、十六进制(
0xFF)都会提示「数字格式不合法」。
四、如何快速定位到出错的位置
浏览器原生报错只给出一个 position N 字符偏移量,长文本里非常难数。本站的两个工具把它翻译成了「第 X 行,第 X 列」加中文说明:
- 用 JSON 格式化 粘贴文本并格式化,出错行会整行高亮、行号出现标记,直接跳到问题所在。
- 用 JSON 校验 边输入边自动校验,底部状态栏给出「第 X 行,第 X 列」,并附「期望出现什么 token」的提示。
- 需要查看或生成转义序列时,用 JSON 转义 / 反转义 处理引号、换行与 Unicode。
举例:输入 {'a': 1} 这类使用单引号的文本,工具会定位到 第 1 行第 2 列,并提示「JSON 不允许使用单引号,键名与字符串值必须用双引号(期望 " )」。
五、一张速查表
| 规则 | 允许 | 不允许 |
|---|---|---|
| 键名引号 | "key" | key、'key' |
| 尾随逗号 | [1, 2] | [1, 2,] |
| 根元素 | 单个对象 / 数组 | 多个并列的根值 |
| 注释 | — | //、/* */ |
| 字符串换行 | \n | 字符串内直接回车 |
现在就验证你的 JSON
粘贴文本即可自动校验并定位错误,全部在浏览器本地完成,数据不会上传。
常见问题
为什么我的 JSON 看起来没问题,却还是解析报错?
最常见的原因是存在肉眼不可见的字符:文本开头带 BOM(\uFEFF)、从网页或文档复制的全角引号(“ ”)与全角逗号(,)、或字符串里直接换行。核对时请确认引号是英文半角双引号 ",并删除开头多余的不可见字符;也可以用在线转义工具查看字符本身。
JSON 允许写注释吗?
标准 JSON(RFC 8259)不允许任何注释,// 与 /* */ 都会导致解析失败。如果你的配置来自允许注释的方言(如 JSONC、JSON5),需要先去掉注释再交给标准 JSON 解析器;本工作台的所有工具都按标准 JSON 解析。
报错里的 “Unexpected token … in JSON at position N” 该怎么读?
position N 是从 0 开始的字符偏移量,直接数 position 很容易数错。本工作台把该偏移换算成「第 X 行,第 X 列」,并翻译成中文说明与「期望出现什么」,例如单引号会被解释为「JSON 不允许使用单引号,键名与字符串值必须用双引号(期望 " )」。
一份 JSON 文件可以包含多个根对象吗?
不可以。JSON 规定整份文本只能有一个根元素。若同一次传输里有多条记录,请用数组包裹,例如 [{"id":1},{"id":2}];把所有对象直接并列会导致「JSON 主体已结束但仍有多余字符」的错误。
用这些工具检查 JSON 会上传我的数据吗?
不会。本站所有工具都是纯前端实现,解析、校验与转义全部在浏览器本地(Web Worker)完成,没有后端服务与数据库。你可以打开浏览器开发者工具的 Network 面板自行验证:除加载页面所需的静态资源外,没有任何携带你数据的请求。