🕸️ 第八章 Web系统的开发原则
📄 一句话概括

同一份数据,XML 比 JSON 大 71%、解析慢 10 到 20 倍;新接口里 85% 以上用 JSON,但传【文档】的地方 XML 仍然是唯一选择。

📝 本节和前面几节的关系

8-6 说清了边界在哪儿,这一节讲边界上流动的东西长什么样子。教材 8-7 的并列关键词是【XML、JSON】——这两个格式的取舍可以直接用体积和耗时算出来,是本课少数能精确量化的地方。

一、它们解决的是同一个问题

程序之间要传数据,但网络只能传字节流。 于是需要一个约定:怎么把结构化的数据变成一串文字,再变回来。 XML 和 JSON 都是这个约定,区别只在写法。

出身决定了它们的性格:XML 是为【文档】设计的,JSON 是为【数据】设计的。 文档里有正文和标记混在一起的情况,数据里没有。 这一个差别,后来决定了它们各自留在哪里。

二、体积与速度:可以直接量出来的差距

同一份数据(1000 条用户记录)用三种格式写一遍,结果是这样的:

XML 比 JSON 大了 71.2%——多出来的部分几乎全是标签。 压缩能拉近差距,但压完 XML 仍然大 32.4%。

速度上的差距比体积更明显:

原因是 JSON 本来就是 JavaScript 的一部分,浏览器里一个原生函数就能解析; XML 要先建一棵文档树(DOM),再走进去找节点。 省下的不是解析那几毫秒,是每次请求都要付的那几毫秒。

三、XML 在哪些地方仍然非它不可

但 XML 并没有死。它在三类场景里活得很好:

还有一些你天天在用、但没意识到的东西:

所以【XML 过时了】这个说法不成立——它只是退到了它真正擅长的地方。

四、选哪个:一句话规则

选择标准可以压缩成一句话:

传【数据】用 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 秒实验

  1. 在浏览器地址栏打开任意一个公开 API,看返回的是 JSON 还是 XML。
  2. 把任意一个 .docx 或 .xlsx 文件的后缀改成 .zip,解压后进去看看——里面全是 XML。
  3. 数一下你手上项目里有几个 package.json,再数有几个 XML 配置——这就是两种格式在你身边的分布。

常见误区

  1. 错误:XML 已经淘汰了。——纠正:它退到了文档和存量系统这两个位置,而且 Word、Excel、SVG、Android 布局内部全是 XML。
  2. 错误:JSON 能做 XML 能做的一切。——纠正:JSON 没有注释、没有属性、没有命名空间,也表达不了正文与标记混排,这几样 XML 都有。
  3. 错误:压缩之后两者差不多,体积不重要。——纠正:压缩后 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。** 前者轻快、原生支持;后者表达力强、校验严格。

相关笔记