深入解析YAML:从基础语法到高级应用
目录
- YAML简介
- 核心语法结构
- 数据类型详解
- 高级语法特性
- 常见应用场景
- 工具与库支持
- 注意事项与最佳实践
- 完整示例集合
1. YAML简介
YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化标准,具有以下特性:
• 强调可读性 > 配置复杂性
• 适用于配置文件、数据交换、持久化存储
• 支持复杂数据类型和对象引用
• 跨语言支持(Python/Java/Go/Ruby等)
• 文件扩展名:.yaml
或 .yml
与同类技术的对比:
特性 |
YAML |
JSON |
XML |
可读性 |
高 |
中 |
低 |
注释支持 |
✓ |
✗ |
✗ |
数据类型 |
自动推断 |
显式声明 |
无 |
文件大小 |
紧凑 |
中等 |
庞大 |
2. 核心语法结构
2.1 文档结构
2.2 注释
2.3 键值对
1 2 3
| simple: value quoted: "带特殊字符的值" nested.key: 多级键
|
2.4 列表
1 2 3 4 5 6 7
| - Item 1 - Item 2 - Item 3
[1, 2, 3]
|
2.5 多行文本
1 2 3 4 5 6 7
| literal: | 保留换行和缩进 第二行
folded: > 合并换行为空格 但保留段落分隔
|
3. 数据类型详解
3.1 标量类型
1 2 3 4 5 6 7 8 9 10 11
| string: "Hello World" integer: 123 float: 3.14 boolean: - true - false - yes - no null: ~ date: 2023-07-20 datetime: 2023-07-20T15:30:00+08:00
|
3.2 集合类型
映射(Map):
1 2
| key1: value1 key2: value2
|
嵌套结构:
1 2 3 4 5
| parent: child1: value1 child2: - item1 - item2
|
3.3 特殊类型
二进制数据:
1 2 3 4 5
| binary: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4H+ho5SUlBQU FAAAD=
|
4. 高级语法特性
4.1 锚点与别名
1 2 3 4 5 6 7
| defaults: &defaults adapter: postgres host: localhost
development: <<: *defaults database: dev_db
|
4.2 引用与合并
1 2 3 4 5 6 7 8 9 10 11
| base: &base name: Base values: &base_values - 1 - 2
derived: <<: *base values: - *base_values - 3
|
4.3 多文档支持
1 2 3 4 5
| --- document: first ... --- document: second
|
4.4 类型强制转换
1 2
| string: !!str 123 number: !!float "123.45"
|
5. 常见应用场景
- 配置文件(Kubernetes, Docker Compose)
- CI/CD管道(GitLab CI, GitHub Actions)
- 数据序列化
- API设计(OpenAPI/Swagger)
- 测试数据管理
6. 工具与库支持
语言 |
推荐库 |
Python |
PyYAML, ruamel.yaml |
Java |
SnakeYAML |
JavaScript |
js-yaml |
Go |
go-yaml/yaml |
Ruby |
Psych |
验证工具:
• YAML Lint
• VS Code YAML扩展
7. 注意事项
缩进规则
• 必须使用空格(推荐2空格)
• 禁止Tab键
特殊字符转义
1
| special: "需转义字符:\": {}[], &*#?|-><%=%@\`"
|
性能考量
• 避免深层嵌套(>10层)
• 大文件建议分拆多文档
8. 完整示例集合
示例1:基础配置
1 2 3 4 5 6 7
| server: port: 8080 ssl: true cors: - "https://example.com" - "https://test.com"
|
示例2:复杂结构
1 2 3 4 5 6 7 8 9 10 11 12
| person: name: John Doe age: 35 address: &main_address street: 123 Main St city: Anytown shipping_address: *main_address orders: - id: 1 items: [ "book", "pen" ] - id: 2 items: [ "laptop" ]
|
示例3:多文档流
1 2 3 4 5 6 7 8 9 10
| ---
database: name: primary connection: mysql://user@host ... --- database: name: replica connection: postgres://user@host
|
延伸学习:
• YAML 1.2规范文档
• JSON Schema到YAML的转换
• YAML与模板引擎的结合使用(Helm, Ansible)