教程 · 结构

JSON、YAML、XML 怎么选

三种格式都能表达嵌套数据。选错的代价通常不是「不能用」,而是联调时互相转一层,注释丢了、类型漂了、缩进炸了。下面按场景说,不搞格式鄙视。

对照

JSONYAMLXML
浏览器 / 前端原生要库DOM 能解析,当数据用别扭
注释标准没有
人写配置括号多省事,怕缩进标签最长
类型少而清楚隐式类型容易踩默认都是文本
属性 / 混排文本

接口:默认 JSON

REST、大多数 RPC 网关、前端 fetch,默认就是 JSON。体积比 XML 小,解析实现到处都是。除非对端是老 SOAP 或行业强制 XML(部分政务、金融报文),新接口不要为了「看起来正式」上 XML。

GraphQL 的 body 也是 JSON。gRPC 用 protobuf,那是另一条线,和这三种文本格式不是互相替换关系。

配置:YAML 常见,JSON 更老实

Kubernetes、GitHub Actions、Docker Compose 用 YAML,因为人要写注释、写很长的列表。代价是缩进:Tab 和空格混用、同级对不齐,报错行号经常指到下一节。

YAML 还有隐式类型:NOoff 在旧版可能被当成 boolean。1.0"1.0" 也不总是你想的那样。挪威国家代码 NO 当年还闹过笑话。新项目若团队不熟 YAML,配置用 JSON 或 TOML,少很多「为什么变成 false」。

JSON 做配置的缺点是不能写注释。可以用旁边的 README,或改用 JSONC(要接受「不是所有工具都认」)。

文档和混排:XML 还在

同一段里既有属性又有子节点、还要夹纯文本,JSON 会很丑(#text 这种键)。Office、部分出版和老企业总线仍是 XML。新业务文档如果只是结构化字段,不必为了「行业习惯」强行 XML。

互转时会丢什么

  • YAML → JSON:注释没了;锚点 & / * 要先展开。
  • XML → JSON:属性往哪放没有唯一标准,有的工具变成 @id,有的摊平。数组「只有一个元素」时,有的实现会变成对象而不是单元素数组。
  • JSON → YAML:一般安全,但长字符串、多行、和 null 的写法因库而异。

转完不要只看「能 parse」。用树把关键路径对一遍,尤其是列表长度。HiJSON 读的是 JSON;YAML/XML 先在你们的转换步骤里变成 JSON,再贴进来查,见 树视图

同一份数据三种写法

{
  "service": "checkout",
  "replicas": 2,
  "env": ["prod"]
}

YAML 大致是:

service: checkout
replicas: 2
env:
  - prod

XML 会变成一串标签,replicas 到底是属性还是子元素,两边要先说好。没有「正确的 XML」,只有你们契约里的那一种。

实用建议

  • 对浏览器和公开 HTTP API:JSON。
  • 人要改、又要注释的运维配置:YAML,并在 CI 里做校验,不要只靠肉眼。
  • 已有 XML 体系:继续 XML,对外增加 JSON 适配层,而不是让前端直接啃 SOAP。
  • 仓库里的结构化数据若要稳定 diff:JSON 格式化后提交,见 格式化指南

常见问题

能把 YAML 直接贴进 HiJSON 吗?
不能当 JSON 解析。先转成 JSON,或只把已经是 JSON 的片段贴进来。
TOML 呢?
适合扁平、表格式配置(不少 Rust/Python 项目)。嵌套一深就不如 JSON 直观。和 JSON 互转同样要核对数组和类型。

相关教程

转成 JSON 之后对照结构

列表有没有被压成单个对象,用树一眼能看出来。

打开 HiJSON →