对照
| JSON | YAML | XML | |
|---|---|---|---|
| 浏览器 / 前端 | 原生 | 要库 | 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 还有隐式类型:NO、off 在旧版可能被当成 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 互转同样要核对数组和类型。