同一份数据,XML 比 JSON 大 71%、解析慢 10 到 20 倍;新接口里 85% 以上用 JSON,但传【文档】的地方 XML 仍然是唯一选择。
8-6 说清了边界在哪儿,这一节讲边界上流动的东西长什么样子。教材 8-7 的并列关键词是【XML、JSON】——这两个格式的取舍可以直接用体积和耗时算出来,是本课少数能精确量化的地方。
一、它们解决的是同一个问题
程序之间要传数据,但网络只能传字节流。 于是需要一个约定:怎么把结构化的数据变成一串文字,再变回来。 XML 和 JSON 都是这个约定,区别只在写法。
- XML 用开闭标签,像
<user><name>张三</name></user>。1998 年定下来,出身于文档世界。 - JSON 用键值对和方括号,像
{"name": "张三"}。2001 年出现,出身于 JavaScript。
出身决定了它们的性格:XML 是为【文档】设计的,JSON 是为【数据】设计的。 文档里有正文和标记混在一起的情况,数据里没有。 这一个差别,后来决定了它们各自留在哪里。
二、体积与速度:可以直接量出来的差距
同一份数据(1000 条用户记录)用三种格式写一遍,结果是这样的:
- JSON 156 KB,XML 267 KB,CSV 98 KB。
- 压缩后:JSON 34 KB,XML 45 KB,CSV 28 KB。
XML 比 JSON 大了 71.2%——多出来的部分几乎全是标签。 压缩能拉近差距,但压完 XML 仍然大 32.4%。
速度上的差距比体积更明显:
- 解析 1 MB JSON 约 5 毫秒;
- 解析 1 MB XML 约 50~100 毫秒;
- 差距 10~20 倍。
原因是 JSON 本来就是 JavaScript 的一部分,浏览器里一个原生函数就能解析; XML 要先建一棵文档树(DOM),再走进去找节点。 省下的不是解析那几毫秒,是每次请求都要付的那几毫秒。
三、XML 在哪些地方仍然非它不可
但 XML 并没有死。它在三类场景里活得很好:
- 企业系统对接——企业集成市场里 XML 仍占约 52%,因为 XSD 这套严格校验比 JSON Schema 成熟得多。
- 文档类数据——正文和标记混在一起,JSON 表达不了这种结构。
- SOAP 老服务——银行、保险、政务的存量接口,不可能为了时髦重写。
还有一些你天天在用、但没意识到的东西:
- Word 和 Excel 文件,内部就是 XML(OOXML 格式)。
- SVG 矢量图,是 XML。
- Android 的界面布局,是 XML。
- RSS/Atom 订阅、MathML 公式,都是 XML。
所以【XML 过时了】这个说法不成立——它只是退到了它真正擅长的地方。
四、选哪个:一句话规则
选择标准可以压缩成一句话:
传【数据】用 JSON,传【文档】用 XML。
展开成几个具体判断:
- 新写一个 Web 接口——用 JSON。今天新 API 里 JSON 的占比已经超过 85%。
- 要跟银行或政府的存量系统对接——用 XML,而且多半有现成的标准文档照着填。
- 数据里有大段正文和零散标记交织——用 XML,JSON 做不到。
- 数据要给人看、要能手改——用 JSON,简单到可以手写;XML 报个括号错要找半天。
还有一个实用差别:JSON 不支持注释,XML 支持。
所以配置文件里如果特别需要写说明,XML 反而合适——
这也是 Maven 的 pom.xml 到现在还是 XML 的原因之一。
五、动手 Demo:把体积差距算清楚
体积差多少、压缩后还剩多少,直接算:
# 1000 条用户记录,同一份内容
print(" XML 比 JSON 大 %.1f%%" % ((267 / 156 - 1) * 100))
print(" 压缩后 XML 仍大 %.1f%%" % ((45 / 34 - 1) * 100))
print(" CSV 只有 JSON 的 %.0f%%" % (98 / 156 * 100))
实跑输出:
--------------------------------------------------------------------
XML 和 JSON 的账,用体积和耗时算
--------------------------------------------------------------------
两者解决的是同一个问题——把结构化数据变成一串能传输的文字,
只是取舍不同。先把特征摊开:
特征 JSON XML
--------------------------------------------------------
出生年份 2001 年 1998 年
写法 键值对 + 方括号 开闭标签嵌套
注释 不支持 支持
属性 没有,只有键值 标签可带属性
命名空间 没有 有,能混多套标准
数组 原生支持 没有,得靠重复标签
严格校验 JSON Schema(较新) XSD/DTD(很成熟)
--------------------------------------------------------
换成具体数字,差距是这样的(1000 条用户记录,同一份内容):
格式 原始大小 压缩后 说明
--------------------------------------------------------
JSON 156 KB 34 KB 数据 98 KB,语法 35 KB
XML 267 KB 45 KB 标签占了 142 KB
CSV 98 KB 28 KB 几乎没有语法开销
--------------------------------------------------------
同一份内容,XML 比 JSON 大了 111 KB——多出来的部分几乎全是标签。
压缩能缩小差距,但压完 XML 还是大 32%。
解析速度的差距比体积更明显:
场景 耗时
----------------------------------
解析 1 MB JSON 约 5 毫秒
解析 1 MB XML 约 50~100 毫秒
差距 10~20 倍
----------------------------------
JSON 快的原因是它本来就是 JavaScript 的一部分,
浏览器里一个原生函数就能解析;XML 得先建一棵文档树(DOM)再走进去找。
所以新写的接口里,用 JSON 的已经占 85% 以上。
但 XML 并没有死,它在三类地方活得很好:
场景 为什么非它不可
---------------------------------------------------
企业系统对接 企业集成里 XML 仍占 52%
文档类数据 正文和标记混在一起,JSON 表达不了
SOAP 老服务 银行、保险、政务的存量接口
---------------------------------------------------
补一个冷知识:你正在用的 Word 和 Excel 文件,内部就是 XML。
同理还有 SVG 图、Android 的界面布局——都是 XML。
所以选择标准可以简化成一句话:
传【数据】用 JSON,传【文档】用 XML。
71.2% 这个数字是每一份数据都要重复付一次的。 接口调用量大起来之后,这个差距会直接变成带宽账单。 而压缩能救回一部分,救不回全部——标签的结构是重复的,重复的东西压得掉,标签本身压不掉。
30 秒实验
- 在浏览器地址栏打开任意一个公开 API,看返回的是 JSON 还是 XML。
- 把任意一个
.docx或.xlsx文件的后缀改成.zip,解压后进去看看——里面全是 XML。 - 数一下你手上项目里有几个
package.json,再数有几个 XML 配置——这就是两种格式在你身边的分布。
常见误区
- 错误:XML 已经淘汰了。——纠正:它退到了文档和存量系统这两个位置,而且 Word、Excel、SVG、Android 布局内部全是 XML。
- 错误:JSON 能做 XML 能做的一切。——纠正:JSON 没有注释、没有属性、没有命名空间,也表达不了正文与标记混排,这几样 XML 都有。
- 错误:压缩之后两者差不多,体积不重要。——纠正:压缩后 XML 仍大 32.4%,而且解析耗时差 10~20 倍,这两项都压不掉。
自测三问(点开对答案)
1. JSON 比 XML 小多少、快多少? —— **小 71.2%(压缩后仍大 32.4%),解析快 10~20 倍**(1 MB 约 5 毫秒对 50~100 毫秒)。 2. 为什么 XML 在文档领域不可替代? —— 因为**它支持正文与标记混排、支持注释和属性、有严格的 XSD 校验**;Word、Excel、SVG、Android 布局都建立在这些能力上。 3. 选格式的一句话规则是什么? —— **传数据用 JSON,传文档用 XML。** 前者轻快、原生支持;后者表达力强、校验严格。- ☐ 下一节(8-8 剥离服务器的功能:Mashup、边缘计算)
相关笔记
- 前端与后端的边界 —— 上一节讲边界,这一节讲边界上流的东西
- Web网站的HTTP响应 —— 响应体里装的就是这些格式
- 向Web服务器传输文件和识别请求 —— 数据到底怎么被发出去
- CSV、XML、JSON、YAML-Web中常用的数据格式 —— 四种格式放在一起比较的另一种讲法
- SQL-用于操作数据库的命令 —— 数据从库里出来之后才变成这些格式
- 🕸️ Web技术原理 · 索引