YAML 知识小课堂
YAML(YAML Ain’t a Markup Language)是一种人类可读的数据序列化语言,由 Clark Evans、Ingy döt Net 和 Oren Ben-Kiki 于 2001 年提出。
它以缩进表示结构,广泛用于配置文件与数据交换场景。
💡 核心特点:YAML 是 JSON 的超集
所有合法 JSON 都是合法 YAML,但 YAML 更简洁易读。
✨ 核心特点
| 特性 | 说明 |
|---|---|
| 可读性强 | 接近自然语言,结构清晰 |
| 支持注释 | 使用#添加说明 |
| 跨语言 | 主流编程语言均支持解析 |
| JSON 兼容 | 可直接包含 JSON 风格数据 |
| 简洁表达 | 依赖缩进而非括号结构 |
###🛠️ 基本语法
name:张三age:25isStudent:falsehobbies:-编程-阅读-音乐address:city:北京zip:"100000"📊 数据类型说明
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串 | hello/"hello world" | 一般无需引号,特殊情况需加 |
| 整数 | 42 | 自动识别 |
| 浮点数 | 3.14 | 自动识别 |
| 布尔值 | true / false | 也支持 yes/no、on/off |
| 空值 | null或~ | 等价 |
| 数组 | - item或[1,2,3] | 支持块级与行内 |
| 对象 | key: value | 缩进表示层级 |
| 日期 | 2024-07-06 | ISO 8601 |
| 时间 | 2024-07-06T12:00:00+08:00 | 带时区 |
❌ 常见错误(速记版)
| 错误写法 | 正确写法 | 速记原因 |
|---|---|---|
name:"Tom" | name: "Tom" | 冒号后面必须带空格 |
| Tab 缩进 | 空格缩进 | YAML 不认 Tab,只用空格 |
field: undefined | field: null/field: ~ | YAML 没有 undefined,空值只用null/~ |
code: 08080 | code: "08080" | 0开头数字易变八进制,加引号锁死字符串 |
switch: yes | switch: "yes" | yes/no会被转布尔,文字要加引号 |
| 2空格、4空格混用缩进 | 全局统一缩进空格数 | 缩进乱,直接解析报错 |
empty: ""当作空值 | empty: null | 空字符串≠空值,两种类型不能混用 |
🚀 实际应用示例
Docker Compose
services:web:image:nginx:latestports:-"80:80"environment:NODE_ENV:productionKubernetes
apiVersion:v1kind:Podmetadata:name:my-podspec:containers:-name:nginximage:nginx:1.21ports:-containerPort:80Spring Boot
server:port:8080spring:datasource:url:jdbc:mysql://localhost:3306/mydbusername:rootpassword:secret🔧 进阶语法
多行字符串
保留换行:
description:|第一行 第二行 第三行折叠为一行:
summary:>这是一段很长的文字 会被折叠成一行锚点与引用(复用配置)
defaults:&defaultsadapter:postgreshost:localhostdevelopment:<<:*defaultsdatabase:dev_dbproduction:<<:*defaultshost:prod-db.example.com类型强制转换
age:!!str25flag:!!bool"true"price:!!float"9.99"📌 YAML 速查总结
- ✔ 使用缩进表示结构(禁止 Tab)
- ✔ 键值对:
key: value - ✔ 列表:
- item - ✔ 支持注释:
# comment - ✔ 支持多行字符串(
|/>) - ✔ 支持引用(
&/*/<<) - ✔ 适合配置文件与 DevOps 场景
测试效果
🎯 一句话总结
YAML 的本质是:
用“人类友好的缩进结构”替代“机器友好的括号结构”。
📝 实战互动征集:
结合项目场景聊聊,你会优先选 JSON 还是 YAML?欢迎在评论区分享你的选型思路与实操技巧。
