去年带新同事联调接口,他盯着浏览器里的报错「Unexpected token } in JSON」抓耳挠腮,把前后端代码翻了个底朝天,最后发现是配置里多了一个逗号:「"name": "工具大全",}」。那个逗号,就是 JSON 语法里最经典的坑。JSON 看起来简单,但越是简单的东西,越容易在细节上翻车。这篇把它彻底讲透。

JSON 是什么?

JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式。它最初从 JavaScript 里长出来,但因为简单、通用,现在几乎所有编程语言都能读写它,成了前后端通信、接口返回数据的事实标准。

一句话概括:JSON 就是用文本描述「有什么数据、数据长什么样」,让两个程序之间能互相读懂。

一眼看懂 JSON

JSON 格式化前后对比示意图:左侧是压缩成一行的状态,右侧是缩进分行后的树状结构,包含对象、数组、字符串、数字四种数据类型
图:同一个 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格式化工具:粘贴进去,自动格式化并高亮,有语法错误会直接提示出错位置,还支持压缩成一行方便传输。

三个常见误区

  • 误区一:JSON 就是 JavaScript 对象。JSON 是独立于语言的文本格式,只是长得像 JS 对象。Python、Java、Go 都能读写 JSON,区别只在于各语言解析库的写法。
  • 误区二:JSON 里能写注释。不能。JSON 设计为纯数据格式,要注释请选 JSONC、JSON5 之类的扩展格式,或把说明写进字段名。
  • 误区三:格式化会改变数据。格式化只是重新排版,值和结构一个字节都不会变;压缩和格式化可以来回转换,这就是「数据无损」的意义。

常见问题(FAQ)

JSON 报错说位置不对,怎么看?

先看最外层花括号是否成对,再查尾逗号和引号;本站 JSON 格式化工具会直接提示出错位置,比肉眼一行行找快得多。

数字在 JSON 里要加引号吗?

不加。加引号会变成字符串,比较大小、排序的结果完全不同——字符串数字和数字是两个东西。

JSON 和 YAML 怎么选?

JSON 无注释、严格、机器友好,适合接口和程序间交换;YAML 允许注释、更适合人写的配置文件。项目里用哪种,跟紧团队约定就好。

JSON 是开发者的「通用语言」:前端看得懂、后端写得出、数据库存得下。掌握它并不难——记牢那五条语法规则,再配合一个JSON格式化工具,基本就够用了。想继续补开发基础,可以接着读:Base64 是什么?一文看懂编码原理与在线转换,以及时间戳是什么?Unix 时间戳与日期转换入门