JSON vs XML:为什么现代 API 都选择 JSON

JSON 和 XML 都是结构化数据格式,但在实际开发中的使用体验差异很大。XML 更明确、更冗长,在一些企业系统和历史接口里仍然常见。JSON 更紧凑、更容易阅读,也已经成为现代 REST API、Webhook、前端应用和日志系统的默认格式。

这里的问题不是 XML 是否已经过时。XML 在 SOAP API、文档格式、需要命名空间的系统、混合文本标记等场景中仍然有价值。更实际的问题是:为什么大多数新 Web API 会选择 JSON?开发者在发送或保存 JSON payload 前,又应该检查什么?

JSON 和 XML 对比

下面是同一份用户数据的 XML 表示:

<user>
  <id>1</id>
  <name>张三</name>
  <email>[email protected]</email>
  <active>true</active>
</user>

对应的 JSON 表示是:

{
  "id": 1,
  "name": "张三",
  "email": "[email protected]",
  "active": true
}

JSON 更短,因为每个字段名只出现一次。XML 中字段名通常既要出现在开始标签里,也要出现在结束标签里。对于很小的 payload,这点差异不明显;但对于大型 API 响应,它会影响可读性、传输体积和调试速度。

为什么 API 更偏向 JSON

JSON 天然对应对象、数组、字符串、数字、布尔值和 null。这些类型和 JavaScript、TypeScript、Go、Python、Java、PHP 等语言里的基础数据结构都很容易互相转换。

因此 JSON 很适合:

  • REST API 请求体和响应体。
  • Webhook payload。
  • 前端页面状态初始化。
  • 工具生成的配置片段。
  • 结构化应用日志。
  • 在浏览器调试工具、终端脚本和数据库之间复制的数据。

JSON 也很适合浏览器调试。开发者可以从 Network 面板复制响应,格式化 payload,截取一小段数据复现问题,而不需要理解额外的标记模型。

XML 仍然适合哪些场景

XML 有一些 JSON 并不打算替代的能力,比如属性、命名空间、Schema、注释、处理指令,以及文本和结构混合的内容。这些能力在文档型数据和成熟企业系统里仍然有意义。

XML 常见于:

  • SOAP 集成。
  • RSS 和 Atom feed。
  • Office 文档内部格式。
  • 部分支付、银行、政务接口。
  • 文本和结构交织在一起的标记型数据。

如果数据更像一份文档,XML 可能是合理选择。如果数据更像对象、数组或接口消息,JSON 通常更简单。

JSON 的语法比 JavaScript 对象更严格

一个常见误区是:看起来像 JavaScript 对象的内容,就一定是合法 JSON。实际上标准 JSON 比 JavaScript 对象字面量严格得多。

下面这段是合法 JavaScript,但不是合法 JSON:

{
  name: '张三',
  active: true,
}

标准 JSON 要求字段名和字符串都使用双引号,而且不允许尾随逗号:

{
  "name": "张三",
  "active": true
}

这个区别在 API 接口、数据库 JSON 字段、浏览器 JSON.parse() 中尤其重要。JSON5 和带注释 JSON 可以用于本地配置,但在作为 API 数据发送前,通常应该先转换为标准 JSON。

API 调试中常见的 JSON 问题

当接口拒绝 JSON payload 时,原因经常很小:

  • }] 前面多了尾随逗号。
  • 字符串使用了单引号。
  • 从配置文件复制时带上了注释。
  • 对象字段之间少了逗号。
  • API 需要数字或布尔值,但 payload 里传成了字符串。
  • 嵌套 JSON 字符串没有单独解析。
  • 从 URL 查询参数复制出来的 JSON 没有先解码。

例如下面这段看起来很清楚,但严格 JSON 解析会失败:

{
  "limit": 20,
  "includeArchived": false,
}

最后一个逗号是非法的。严格解析器可能提示 Unexpected token },看起来像是右大括号有问题,实际原因通常是前面的逗号。

如何选择 JSON、XML 和 JSON5

如果数据要在系统之间交换、写入 JSON 数据库字段、发送到 REST API,或交给标准库解析,优先使用 JSON。

如果外部系统明确要求 XML,或者需要命名空间、Schema、文档型结构,那么继续使用 XML。

如果文件主要由人维护,并且消费方明确支持 JSON5 或 JSONC,可以使用带注释 JSON。但它不应该被当成 API payload 的默认格式。

推荐检查流程

当你从日志、浏览器调试工具、Webhook 后台或同事那里拿到一段 payload 时,先按这个流程检查:

  1. 先格式化,让对象和数组层级清楚可见。
  2. 如果要发给 API,确认它是标准 JSON。
  3. 检查字符串、数字、布尔值、数组和对象的类型是否符合接口要求。
  4. 如果内容来自 URL 或 Base64,先解码再检查。
  5. 用最小可用样例测试接口,再发送完整 payload。

需要快速检查一段 JSON,可以直接使用下面的工具:

也可以打开完整的 JSON 格式化工具。如果 payload 来自 URL,可以先用 URL 编码工具 解码;如果它是通过 Base64 传输的,可以先用 Base64 工具 解码,再检查解码后的 JSON。