XML 和 JSON 有什么区别?什么时候该用 XML?
XML 和 JSON 是两种最常用的数据交换格式,但它们的定位不同:XML 是标记语言,擅长表达文档结构;JSON 是数据格式,擅长表达结构化数据。现代 Web 开发 90% 的场景用 JSON,但 XML 在特定领域仍然不可替代。
核心区别
| 特性 | XML | JSON |
|---|---|---|
| 定位 | 标记语言,面向文档 | 数据格式,面向数据 |
| 语法 | 标签闭合 <name>值</name> | 键值对 "name": "值" |
| 数据类型 | 无内置类型,都是字符串 | string、number、boolean、null、array、object |
| 注释 | 支持 <!-- --> | 不支持 |
| 命名空间 | 支持,避免标签冲突 | 不支持 |
| 验证 | DTD / XSD 成熟方案 | JSON Schema(较新,工具链不完善) |
| 冗余度 | 高(开闭标签重复) | 低 |
| 解析速度 | 慢(DOM/SAX) | 快(原生支持) |
一句话概括:XML 能做文档,JSON 只能做数据;JSON 传输快,XML 验证强。
什么时候必须用 XML
包含文档内容:XML 的标签能表达语义和层级(标题、段落、列表),JSON 的键值对做不到。Office 文档(docx、xlsx)底层是 XML,RSS/Atom feed 也是 XML——这些场景需要混合内容和结构。
需要严格验证:XSD 可以定义精确的类型约束(值范围、正则模式、枚举),JSON Schema 功能弱得多。金融、医疗、政府数据交换标准(如 HL7、FHIR 的 XML 格式)依赖 XSD 验证。
命名空间:多个词汇表组合时,命名空间避免标签冲突。SOAP、XHTML、SVG 都用命名空间。JSON 没有这个能力。
遗留系统集成:企业里大量旧系统只认 XML。SAP、Oracle、银行接口——你不想用也得用。
JSON 的优势场景
Web API:RESTful API 用 JSON 是事实标准。体积小、解析快、前端原生支持,没有理由用 XML。
配置文件:package.json、tsconfig.json、.eslintrc——开发工具链已经全面倒向 JSON(以及 JSON 超集如 JSON5、YAML)。
移动端和低带宽场景:JSON 比 XML 小 30-50%,解析快 2-3 倍。移动网络下这个差距很实际。
NoSQL 数据库:MongoDB、CouchDB 存储 JSON 文档,查询天然适配。
同一数据的格式对比
xml<!-- XML --> <book id="1" category="web"> <title>XML Guide</title> <price>39.95</price> <tags> <tag>XML</tag> <tag>Programming</tag> </tags> </book>
json{ "id": 1, "category": "web", "title": "XML Guide", "price": 39.95, "tags": ["XML", "Programming"] }
XML 版本 156 字节,JSON 版本 98 字节。数据量大的时候,这个差距更明显。
格式互转
XML 和 JSON 互转不是无损的——XML 的属性、命名空间、混合内容在 JSON 里没有对应概念:
- XML 属性(
<book id="1">)转 JSON 时变成普通字段,丢失"这是属性"的语义 - XML 混合内容(
<p>文字<b>加粗</b>继续</p>)转 JSON 需要特殊处理 - JSON 的数组类型转 XML 时只能用重复标签模拟
所以别指望"先写 XML 再转 JSON"或反过来——两种格式的数据模型不同,互转会丢信息。
选型决策
简单判断:如果数据是给人读的文档,用 XML;如果是给程序消费的结构化数据,用 JSON。如果两者都涉及(比如带格式的富文本数据),考虑用 JSON 做传输、XML 做存储,或者直接用 Markdown + JSON 元数据的组合方案。