cv.cm

知识库 · 文本、数据与安全

JSON、YAML、XML 有什么区别?该用哪种格式?

阅读约 5 分钟

简短回答

JSON、YAML 和 XML 都是表示结构化数据的文本格式。JSON 紧凑而严格,有六种值类型,是 Web API 的主流。YAML 基于缩进,支持注释,常用于配置文件。XML 使用标签和属性,支持命名空间和正式的 Schema,在文档、企业系统和订阅源中仍很常见。三者都能表示同样的嵌套数据。

打开JSON 格式化

同一份数据,三种格式

一个包含姓名、启用标志和两个角色的用户,用三种格式分别表示如下:

格式示例
JSON{"name": "Ana", "active": true, "roles": ["admin", "editor"]}
YAMLname: Ana / active: true / roles: [admin, editor](每行一个键)
XML<user active="true"><name>Ana</name><role>admin</role><role>editor</role></user>

JSON 和 YAML 可以直接映射到大多数编程语言中的对象、列表和标量。XML 描述的是一棵元素树,映射成对象只是一种约定:这里的启用标志既可以是属性,也可以是子元素,而且 XML 本身并没有说明这个值是布尔值,而不是文本 true。

横向对比

JSONYAMLXML
规范RFC 8259, ECMA-404YAML 1.2.2(2021)W3C XML 1.0 第五版
结构花括号和方括号缩进开始标签和结束标签
注释不允许# comment<!-- comment -->
内置类型对象、数组、字符串、数字、布尔值、null映射、序列,标量会被解析为具体类型只有文本,除非 Schema 指定类型
Schema 语言JSON Schema通常用 JSON SchemaXSD, DTD, RELAX NG
额外特性无锚点和别名,单个文件可包含多个文档属性、命名空间、混合内容
典型用途Web API、浏览器数据、日志配置:Kubernetes、CI 流水线、Docker ComposeOffice 文件、SVG、RSS、SOAP、Android 布局

JSON:严格且可预测

JSON 的语法小到一页纸就能写完,所以各种语言的解析器对它的理解完全一致。但这种严格也带来了最常见的错误:

  • 键和字符串必须用双引号,单引号无效。
  • 对象或数组最后一项后面不能有逗号。
  • 不能写注释,所以用 JSON 写的配置无法自我说明。JSONC、JSON5 等变体加入了注释,但它们不是标准 JSON。
  • RFC 8259 要求在系统之间交换的 JSON 使用 UTF-8。

语法本身对数字大小没有限制,但 RFC 8259 指出大多数软件使用 IEEE 754 双精度浮点数。在 JavaScript 中,超过 9007199254740992(2^53)的整数会丢失精度,所以较大的 ID 用字符串传输更安全。

YAML:易读,但暗藏陷阱

YAML 是为人类阅读和编辑而设计的,YAML 1.2 几乎是 JSON 的超集,所以大多数 JSON 文件也是合法的 YAML。但它的灵活性是有代价的:

  • 缩进即结构。一个空格放错就会改变嵌套层级,而且缩进不允许使用 Tab。
  • 不加引号的值会被猜测类型。按照许多解析器仍在使用的 YAML 1.1 规则,no、off 和 yes 会变成布尔值,于是国家代码 NO(挪威)变成了 false。YAML 1.2 的核心 Schema 只把 true 和 false 当作布尔值,但请确认你的解析器实现的是哪个版本。
  • 1.10 这样的值可能变成数字 1.1,012 可能变成八进制数。版本号、邮政编码这类只是长得像数字的字符串,请加上引号。

XML:冗长,但为文档而生

对于纯数据,XML 比 JSON 臃肿,但它能处理另外两种格式做不到的事:混合内容(文本中夹带行内标记,如 <p>Hello <b>world</b></p>)、让不同来源的词汇表共存于一个文件的命名空间,以及通过 XSD 实现的成熟校验。DOCX、XLSX、SVG 和 RSS 等格式的底层都是 XML。

XML 转 JSON 天生会丢失信息。属性、元素顺序、重复元素和混合内容在 JSON 中没有唯一的对应形式,所以转换工具会采用各种约定,比如给属性加 @ 前缀,或强制把重复元素转成数组。

常见问题

YAML 是 JSON 的超集吗?

YAML 1.2 经过修订,几乎是 JSON 的严格超集,所以几乎所有 JSON 文档都能按 YAML 解析。少数边界情况有差异,而 YAML 1.1 解析器的兼容性更差。

JSON 为什么不允许注释?

JSON 的作者有意去掉了注释,以免有人用注释携带解析指令、破坏互操作性。需要在配置中写注释的工具,会改用 JSONC、JSON5 或 YAML。

JSON 和 XML 哪个解析更快?

同样的数据,JSON 通常更快、更小,因为它的语法更简单,没有结束标签、属性和命名空间。这种差异主要在数据量很大时才明显。

YAML 转 JSON 会丢失信息吗?

数据本身不会丢,但注释、锚点和键的书写格式会丢失,因为 JSON 里没有地方存放它们。JSON 转 YAML 则不会丢失任何信息。

全部知识文章