有关yaml格式的基本知识

First Post:

Last Update:

Word Count:
754

Read Time:
3 min

Page View: loading...


深入解析YAML:从基础语法到高级应用

目录

  1. YAML简介
  2. 核心语法结构
  3. 数据类型详解
  4. 高级语法特性
  5. 常见应用场景
  6. 工具与库支持
  7. 注意事项与最佳实践
  8. 完整示例集合

1. YAML简介

YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化标准,具有以下特性:
• 强调可读性 > 配置复杂性
• 适用于配置文件、数据交换、持久化存储
• 支持复杂数据类型和对象引用
• 跨语言支持(Python/Java/Go/Ruby等)
• 文件扩展名:.yaml.yml

与同类技术的对比:

特性 YAML JSON XML
可读性
注释支持
数据类型 自动推断 显式声明
文件大小 紧凑 中等 庞大

2. 核心语法结构

2.1 文档结构

1
2
3
4
5
6
# 文档开始标记
---
# 文档内容
key: value
# 文档结束标记
...

2.2 注释

1
2
# 单行注释
key: value # 行尾注释

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. 常见应用场景

  1. 配置文件(Kubernetes, Docker Compose)
  2. CI/CD管道(GitLab CI, GitHub Actions)
  3. 数据序列化
  4. API设计(OpenAPI/Swagger)
  5. 测试数据管理

6. 工具与库支持

语言 推荐库
Python PyYAML, ruamel.yaml
Java SnakeYAML
JavaScript js-yaml
Go go-yaml/yaml
Ruby Psych

验证工具
YAML Lint
• VS Code YAML扩展


7. 注意事项

  1. 缩进规则
    • 必须使用空格(推荐2空格)
    • 禁止Tab键

  2. 特殊字符转义

    1
    special: "需转义字符:\": {}[], &*#?|-><%=%@\`"
  3. 性能考量
    • 避免深层嵌套(>10层)
    • 大文件建议分拆多文档


8. 完整示例集合

示例1:基础配置

1
2
3
4
5
6
7
# application.yaml
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)