YAML 到底是什么?用购物清单来理解
打开冰箱,你发现要做饭了。随手在便签上写:
购物清单
- 鸡蛋
- 牛奶
- 面包
全麦的
- 蔬菜
- 西红柿
- 黄瓜
你家人看了也能懂。不用学新技能,不用记特殊符号,缩进+短横线就把层级关系说清楚了。
YAML 就是计算机世界的「购物清单」。它的名字是递归缩写:YAML Ain’t Markup Language(YAML不是标记语言),取首字母缩写回来叫 YAML,像个俄罗斯套娃。
YAML 的全称是 YAML Ain’t Markup Language,最早在2001年由一个程序员团队设计,目标是让人手写配置文件时不再痛苦。
YAML 有什么用?
YAML 的核心价值就一个:让配置文件更好读、更好写。
看看它出场的场景:
- Docker Compose — 用 YAML 定义多容器应用
- Kubernetes — 用 YAML 声明你的服务架构
- GitHub Actions — 用 YAML 编写自动化流水线
- Ansible — 用 YAML 写运维剧本
- Python 工具 — PyYAML 让你用 Python 读写 YAML
它和 JSON 都能表示结构化数据,但 YAML 不需要引号、花括号和方括号。人类写 YAML 的速度通常比 JSON 快三倍。
YAML 的核心语法
基本类型
YAML 支持几种基础数据类型:
# 字符串
name: 张三
greeting: "Hello World"
# 数字
age: 28
price: 9.99
# 布尔值
isActive: true
isPaid: false
# 空值
nothing: null
# 日期时间
birthday: 2026-06-12
列表(用短横线)
fruits:
- 苹果
- 香蕉
- 橙子
相当于 JSON 里的 ["苹果", "香蕉", "橙子"]。
字典/对象(用冒号)
person:
name: 张三
age: 28
city: 北京
这就是个嵌套的对象。
列表里面套对象
这是 YAML 最常用的写法之一:
employees:
- name: 张三
role: 工程师
- name: 李四
role: 设计师
多行文本(用管道符)
description: |
这是一段多行文本。
会自动保留换行。
每一行都是内容的一部分。
注意缩进!
YAML 只用空格缩进,不用 Tab。这是新手最容易踩的坑。两层缩进通常用两个空格:
server:
host: localhost
port: 8080
ssl:
enabled: true
cert: /path/to/cert.pem
YAML vs JSON:怎么选?
两者都能表示同样的数据结构,区别主要在风格:
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| 配置文件 | YAML | 人类可读性好 |
| API 数据交换 | JSON | 所有语言原生支持 |
| 需要复杂类型 | YAML | 支持锚点、合并键等特性 |
| 需要严格校验 | JSON | Schema 工具链更成熟 |
简单说:人写的选 YAML,机器间传递的选 JSON。
常见坑
- 缩进用 Tab — YAML 解析器会直接报错。永远用空格。
- 引号别乱加 —
yes和"yes"在 YAML 里类型不同。不加引号的yes会被识别为布尔值true。 - 特殊字符 —
:、#、[]在值里面出现时要用引号包裹。比如url: http://example.com没问题,但note: key: value就需要写成note: "key: value"。 - 大数字被转科学计数 —
1e9会被当数字而不是字符串,写配置时注意。
总结
YAML 的设计哲学就一句话:让配置文件看起来像人说的话。
它不追求性能,不追求功能全面,就追求一件事——你在终端里编辑 docker-compose.yml 时,不会对着满屏的花括号和引号怀疑人生。
下次你再看到 .yml 或 .yaml 结尾的文件,别慌。把它当成一份带缩进的购物清单,一层一层往下看,基本都能读懂。
你平时在哪些场景见过 YAML?欢迎留言聊聊。