去年带新同事联调接口,他盯着浏览器里的报错"Unexpected token } in JSON"抓耳挠腮,把前后端代码翻了个底朝天,最后发现是配置里多了一个逗号:"name": "工具大全",}。那个逗号,就是 JSON 语法里最经典的坑。JSON 看起来简单,但越是简单的东西,越容易在细节上翻车。
JSON 是什么
JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式。它最初从 JavaScript 里长出来,但因为简单、通用,现在几乎所有编程语言都能读写它,成了前后端通信、接口返回数据的事实标准。一句话:JSON 就是用文本描述"有什么数据、数据长什么样",让两个程序之间能互相读懂。
拿上图拆开看:最外层是一对花括号 {},里面是键值对;键和值用冒号隔开,多个键值对用逗号隔开。整个结构就三件事:花括号包对象、方括号包数组、双引号包字符串。
JSON 支持哪些数据类型
| 类型 | 写法 | 说明 |
|---|---|---|
| 对象 | {"name": "工具大全"} | 花括号包键值对,键必须是字符串 |
| 数组 | ["工具", "效率"] | 方括号包有序列表,元素可以是任意类型 |
| 字符串 | "免费" | 必须用英文双引号,不能是单引号 |
| 数字 | 12345 / 3.14 | 整数和小数都支持,不能加引号 |
| 布尔值 | true / false | 小写,注意不是 True |
| 空值 | null | 表示「没有值」,不是 0 也不是空字符串 |
对象和数组可以任意嵌套,所以 JSON 能表达从"一个用户"到"一整页列表"的任意复杂结构。
五条语法规则,背下来少踩坑
键必须用英文双引号。JS 对象写键时可以不带引号,JSON 不行——用英文双引号包住的键才合法,单引号和裸键都会报错。
不能有尾逗号。最后一个键值对后面加逗号是初学者最高频的错误,多写一个逗号整段 JSON 直接非法。
不能写注释。JSON 是纯数据,注释符号一律不允许,别把配置说明塞进来。
字符串要转义。字符串内部出现双引号或反斜杠时,要在前面加反斜杠,否则解析会提前结束报错。
编码建议 UTF-8。中文内容用 UTF-8 编码最稳妥,否则可能出现乱码。
为什么大家都用 JSON 而不是 XML
同样的数据,XML 要写一堆开始和结束标签,JSON 体积小、解析快;键值对天然贴近人读,层级用缩进就能看清;生态好,每种语言都有现成解析库,JavaScript 里一行 JSON.parse() 就能读。
什么时候需要格式化和校验
接口返回的 JSON 有时压缩成一行,肉眼很难定位字段,格式化后一目了然;配置文件多写一个逗号、少写一个引号,程序启动就报错,先校验再排错能省半小时;日志或复制出来的 JSON 来源不明,先校验语法再往代码里贴。这些活儿交给站里的JSON格式化工具:粘进去自动格式化并高亮,有语法错误直接提示出错位置,还支持压缩成一行方便传输。
两个常见误解:JSON 不是 JavaScript 对象,它是独立于语言的文本格式,只是长得像 JS 对象,Python、Java、Go 都能读写;格式化不会改变数据,只是重新排版,值和结构一个字节都不变,压缩和格式化可以来回转换。JSON 是开发者的通用语言,记牢那五条语法规则,再配合一个格式化工具基本就够用了。想补开发基础,可以接着读Base64 是什么?一文看懂编码原理与在线转换和时间戳是什么?Unix 时间戳与日期转换入门。