YAML(YAML Ain't Markup Language,递归缩写)是一种人类可读的数据序列化格式,设计目标是简洁、易读。它广泛用于配置文件(如 Docker Compose、Kubernetes、GitHub Actions、Ansible),因为它比 JSON 更易于人工编辑和阅读。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,源自 JavaScript,但目前被几乎所有编程语言支持。它是 REST API、前后端数据传输、配置存储的事实标准,语法严格,机器解析效率高。
| 特性 | YAML | JSON |
|---|---|---|
| 注释 | 支持(# 开头) | 不支持 |
| 字符串引号 | 通常可省略 | 必须使用双引号 |
| 尾随逗号 | 不需要逗号 | 不允许尾随逗号 |
| 缩进 | 强制(有语义) | 仅用于美化,无语义 |
| 多行字符串 | 原生支持(|、> 语法) | 需用 \n 转义 |
| 数据类型 | 自动推断(更丰富) | 显式(string需引号) |
| 文件体积 | 通常更小 | 通常更大 |
| 解析难度 | 复杂(歧义较多) | 简单(规范严格) |
| 语法 | 用途 | 示例 |
|---|---|---|
|(竖线) | 保留换行的多行字符串(literal block) | message: | line1 line2 |
>(折叠块) | 折叠换行的多行字符串(folded block) | desc: > long text continues |
& / * | 锚点(定义/引用) | base: &anchor {key: val} ref: *anchor |
--- | 文档分隔符(一个文件多份文档) | --- # 文档开始 |
!!type | 显式类型标注 | value: !!str 123 |
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| 配置文件(CI/CD、容器、基础设施) | YAML | 可读性强,支持注释,易维护 |
| REST API 数据交换 | JSON | 标准通用,解析快,浏览器原生支持 |
| 前后端接口协议 | JSON | JavaScript 原生支持,工具链成熟 |
| Kubernetes / Helm Chart | YAML | 行业标准,层级清晰 |
| npm/package.json | JSON | Node.js 生态标准 |
| Swagger / OpenAPI 规范 | YAML 或 JSON | 两者均官方支持 |
yes/no/on/off 在 YAML 1.1 中会被解析为布尔值,建议加引号url: "https://example.com"01234)会被解析为八进制,需要引号JSON.parse() 快速验证合法性。