# YAML 核心知识详解
## 1. YAML 简介
YAML(YAML Ain't Markup Language,YAML不是一种标记语言)是一种直观的、可读性强的数据序列化格式,广泛应用于配置文件、数据交换等场景。它的设计目标是使数据格式既容易被人类阅读,又便于机器解析和生成。
YAML的主要特点:
- 简洁明了,可读性高
- 语法简单,易于学习
- 支持复杂的数据结构
- 跨语言支持
- 强调数据而非格式
## 2. YAML 基本语法规则
### 2.1 大小写敏感
YAML是大小写敏感的,`name`和`Name`被视为两个不同的键。
### 2.2 缩进表示层级关系
YAML使用缩进(空格)来表示数据的层级关系,不使用大括号或方括号。
**注意**:
- 缩进必须使用空格,不能使用制表符(Tab键)
- 通常建议使用2个或4个空格进行缩进
- 同一层级的元素必须保持相同的缩进
### 2.3 键值对表示法
YAML使用冒号加空格(`:`)表示键值对:
```yaml
name: John Doe
age: 30
```
### 2.4 列表表示法
YAML使用连字符加空格(`- `)表示列表元素:
```yaml
fruits:
- Apple
- Banana
- Orange
```
## 3. YAML 数据结构
### 3.1 标量(Scalar)
标量是最基本的数据类型,表示单个值,包括字符串、数字、布尔值、日期等。
#### 3.1.1 字符串
字符串是YAML中最常用的数据类型,可以不加引号:
```yaml
name: John Doe
```
也可以使用单引号或双引号:
```yaml
name: 'John Doe'
message: "Hello, world!"
```
单引号和双引号的区别:
- 单引号中的内容会原样保留,不会解析转义字符
- 双引号中可以使用转义字符(如`\n`、`\t`等)
#### 3.1.2 数字
YAML支持整数、浮点数、科学计数法等:
```yaml
integer: 42
float: 3.14
negative: -10
scientific: 1.23e+4
```
#### 3.1.3 布尔值
YAML中的布尔值可以用`true`/`false`或`yes`/`no`表示:
```yaml
active: true
enabled: yes
inactive: false
disabled: no
```
#### 3.1.4 日期和时间
YAML支持ISO 8601格式的日期和时间:
```yaml
date: 2023-06-15
time: 14:30:00
datetime: 2023-06-15T14:30:00Z
```
**关于T和Z的含义**:
- **T**:是ISO 8601标准中用于分隔日期部分和时间部分的特殊字符,表示"时间"(Time)的起始符号
- **Z**:是ISO 8601标准中表示零时区的特殊字符,等同于协调世界时(UTC,Coordinated Universal Time)<mcreference link="https://wenku.youkuaiyun.com/answer/955c83c7276f47cbb92cdd117261506e" index="1">1</mcreference> <mcreference link="https://worktile.com/kb/ask/3027115.html" index="3">3</mcreference>
例如,`2023-06-15T14:30:00Z` 表示:2023年6月15日14点30分00秒的零时区(UTC)时间。
除了Z之外,ISO 8601还支持使用`+hh:mm`或`-hh:mm`表示其他时区,例如`2023-06-15T14:30:00+08:00`表示东八区时间。<mcreference link="https://blog.youkuaiyun.com/youngzil/article/details/125212861" index="5">5</mcreference>
### 3.2 对象(键值对集合)
对象是键值对的集合,也称为映射(Mapping)或字典(Dictionary)。
#### 3.2.1 简单对象
```yaml
person:
name: John Doe
age: 30
occupation: Developer
```
#### 3.2.2 内联对象
也可以使用花括号表示内联对象:
```yaml
person: { name: John Doe, age: 30, occupation: Developer }
```
### 3.3 数组(列表)
数组是有序的值列表,也称为序列(Sequence)。
#### 3.3.1 简单数组
```yaml
fruits:
- Apple
- Banana
- Orange
```
#### 3.3.2 内联数组
也可以使用方括号表示内联数组:
```yaml
fruits: [ Apple, Banana, Orange ]
```
### 3.4 嵌套结构
YAML允许数据结构的嵌套,创建复杂的数据模型。
#### 3.4.1 对象嵌套
```yaml
company:
name: TechCorp
address:
city: New York
street: 123 Main St
zip: 10001
```
#### 3.4.2 数组嵌套
```yaml
users:
- name: John
roles:
- admin
- user
- name: Jane
roles:
- user
```
#### 3.4.3 混合嵌套
```yaml
projects:
- name: Project A
status: active
team:
- John
- Mary
- name: Project B
status: planning
team:
- Bob
- Alice
```
## 4. YAML 注释方式
YAML使用井号(`#`)表示注释,从`#`开始到行尾的内容都会被忽略。
```yaml
# This is a comment
name: John Doe # This is an inline comment
age: 30
# Comments can be used to separate sections
# Section 2
address: New York
```
## 5. YAML 特殊字符处理
### 5.1 转义字符
在双引号字符串中,可以使用反斜杠(`\`)来转义特殊字符:
```yaml
message: "Hello,\nworld!"
path: "C:\\Users\\john\\Documents"
```
常用的转义字符:
- `\n`:换行符
- `\t`:制表符
- `\\`:反斜杠
- `\"`:双引号
### 5.2 多行字符串
YAML提供了两种方式表示多行字符串:
#### 5.2.1 保留换行符(`|` 块样式)
使用竖线(`|`)保留原始的换行符:
```yaml
multiline: |
This is a
multiline
string
```
解析后的值为:
```
This is a
multiline
string
```
#### 5.2.2 折叠换行符(`>` 折叠样式)
使用大于号(`>`)将换行符折叠为空格:
```yaml
folded: >
This is a
folded
string
```
解析后的值为:
```
This is a folded string
```
### 5.3 强制类型转换
YAML会自动推断值的类型,但有时可能需要明确指定类型:
```yaml
# 强制转换为字符串
number_as_string: !!str 42
# 强制转换为整数
string_as_number: !!int "42"
# 强制转换为布尔值
string_as_boolean: !!bool "true"
```
### 5.4 特殊键名处理
如果键名包含特殊字符或空格,可以使用引号:
```yaml
"special key": value
"key with spaces": value
```
## 6. YAML 与其他配置文件格式的区别
### 6.1 YAML vs XML
- **可读性**:YAML比XML更简洁,可读性更高
- **语法**:YAML使用缩进表示层级,XML使用标签
- **冗余度**:YAML更加简洁,XML有较多的标签冗余
- **解析难度**:YAML解析相对简单,XML解析较为复杂
XML示例:
```xml
<person>
<name>John Doe</name>
<age>30</age>
<occupation>Developer</occupation>
</person>
```
YAML示例:
```yaml
person:
name: John Doe
age: 30
occupation: Developer
```
### 6.2 YAML vs JSON
- **可读性**:YAML比JSON更易读,特别是对于复杂结构
- **语法**:YAML允许注释,JSON不支持注释
- **引号**:YAML中字符串可以不加引号,JSON必须加引号
- **类型**:YAML支持更多的数据类型(如日期、时间)
- **严格性**:JSON是YAML的子集,YAML解析器可以解析大部分JSON
JSON示例:
```json
{
"person": {
"name": "John Doe",
"age": 30,
"occupation": "Developer"
}
}
```
YAML示例:
```yaml
person:
name: John Doe
age: 30
occupation: Developer
```
### 6.3 YAML vs Properties
- **结构**:YAML支持复杂的嵌套结构,Properties通常是扁平的键值对
- **类型**:YAML支持多种数据类型,Properties只有字符串
- **可读性**:YAML对复杂配置的可读性更高
Properties示例:
```properties
person.name=John Doe
person.age=30
person.occupation=Developer
```
YAML示例:
```yaml
person:
name: John Doe
age: 30
occupation: Developer
```
## 7. YAML 在实际开发中的应用场景
### 7.1 配置文件
YAML广泛用于各种框架和工具的配置文件:
#### 7.1.1 Spring Boot 配置
Spring Boot支持使用YAML作为配置文件格式(`application.yml`):
```yaml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
jpa:
hibernate:
ddl-auto: update
show-sql: true
```
#### 7.1.2 Docker Compose 配置
Docker Compose使用YAML定义多容器应用(`docker-compose.yml`):
```yaml
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
```
#### 7.1.3 Kubernetes 配置
Kubernetes资源配置也使用YAML格式:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp:latest
ports:
- containerPort: 8080
```
### 7.2 数据序列化
YAML可以用于数据序列化和反序列化,作为数据交换格式:
```yaml
# 序列化的用户数据
users:
- id: 1
name: John Doe
email: john@example.com
- id: 2
name: Jane Smith
email: jane@example.com
```
### 7.3 API 文档
一些API文档工具使用YAML描述API接口:
```yaml
swagger:
info:
title: Sample API
description: API documentation
version: 1.0.0
paths:
/users:
get:
summary: Get all users
responses:
'200':
description: A list of users
```
### 7.4 自动化测试
测试框架可以使用YAML定义测试用例和数据:
```yaml
# 测试用例
tests:
- name: Login test
steps:
- action: navigate
url: /login
- action: fill_form
username: testuser
password: password123
- action: submit
- action: verify
expected: dashboard_page
```
## 8. YAML 最佳实践
### 8.1 格式一致性
- 保持一致的缩进风格(2或4个空格)
- 保持一致的字符串引号使用规则
- 保持一致的列表和对象表示方式
### 8.2 可读性
- 使用注释说明复杂配置的用途
- 适当使用空行分隔不同的配置部分
- 对大型配置文件进行模块化拆分
### 8.3 避免常见错误
- 不要使用Tab键进行缩进
- 注意字符串中的特殊字符需要转义
- 确保同一层级的元素保持相同的缩进
- 注意YAML是大小写敏感的
### 8.4 安全性考虑
- 避免在YAML配置文件中存储敏感信息(如密码、API密钥等)
- 对于必须存储的敏感信息,考虑使用环境变量或加密存储
## 9. 总结
YAML作为一种简洁、易读的数据序列化格式,在现代软件开发中扮演着重要角色,特别是在配置文件领域。它的语法简单直观,同时支持复杂的数据结构,使其成为许多框架和工具的首选配置格式。
掌握YAML的核心概念和使用方法,对于提高开发效率、简化配置管理具有重要意义。无论是Spring Boot应用开发、容器编排还是自动化测试,YAML都是一个不可或缺的工具。
2169

被折叠的 条评论
为什么被折叠?



