news 2026/2/15 17:03:50

YAML 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YAML 详解

YAML 详解

文章目录

  • YAML 详解
    • 什么是 YAML?
    • 核心特点
      • 1. 可读性强
      • 2. 语言无关
      • 3. 表达能力强
    • 基本语法
      • 数据结构
        • 标量(Scalars)
        • 序列(列表/数组)
        • 映射(字典/对象)
      • 多行文本
      • 特殊特性
        • 锚点和别名(引用)
        • 多文档支持
    • 数据类型详细说明
      • 字符串类型
      • 数字类型
      • 时间类型
    • 注释
    • YAML vs JSON vs XML
      • 示例对比
    • 使用场景
      • 1. 配置文件
      • 2. CI/CD 配置
      • 3. Kubernetes 配置
    • 最佳实践
      • 1. 一致的缩进
      • 2. 键命名规范
      • 3. 避免复杂嵌套
      • 4. 使用引用减少重复
    • 常用工具
      • 1. 验证工具
      • 2. 转换工具
      • 3. 编辑器支持
    • 常见陷阱
      • 1. 缩进错误
      • 2. 布尔值歧义
      • 3. 数字作为字符串
    • 安全注意事项
      • 1. 避免执行任意代码
      • 2. 使用安全加载

什么是 YAML?

YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化语言,专门用于配置文件和数据交换。它比 JSON 更易读,比 XML 更简洁,广泛用于各种编程语言和工具的配置。

核心特点

1. 可读性强

  • 使用缩进表示层次结构
  • 无需大量标点符号
  • 支持自然语言风格的配置

2. 语言无关

  • 几乎所有现代编程语言都支持 YAML
  • 可以轻松转换为 JSON、XML 等其他格式

3. 表达能力强

  • 支持复杂的数据结构
  • 包含引用、多行文本等高级特性

基本语法

数据结构

标量(Scalars)
# 字符串name:"John Doe"simple_string:Hello Worldnumber_as_string:'123'# 数字age:30price:19.99scientific:1.2e+5# 布尔值is_active:trueenabled:false# 空值middle_name:nullnickname:~
序列(列表/数组)
# 短横线表示法fruits:-Apple-Banana-Orange# 行内表示法colors:[Red,Green,Blue]# 嵌套列表matrix:-[1,2,3]-[4,5,6]
映射(字典/对象)
# 基本映射person:name:Johnage:30city:New York# 行内表示法car:{make:Toyota,model:Camry,year:2020}

多行文本

# 保留换行符(|)description:|This is a long description that spans multiple lines. Each newline is preserved.# 折叠为单行(>)summary:>This is a summary that will be folded into a single line with spaces.# 保留尾随换行符(|+)# 删除尾随换行符(|-)

特殊特性

锚点和别名(引用)
# 定义锚点defaults:&defaultsadapter:postgreshost:localhost# 引用锚点development:<<:*defaults# 合并映射database:dev_dbtest:<<:*defaultsdatabase:test_db
多文档支持
# 用 --- 分隔多个文档---server:port:8080host:localhost---database:name:app_dbuser:admin

数据类型详细说明

字符串类型

# 不需要引号(除非有特殊字符)simple:This is a string# 需要引号的情况special:"Text with: colon, and other special chars"single_quotes:'Avoid escaping single quotes'' here'

数字类型

# 整数decimal:42octal:0o52# 八进制hexadecimal:0x2A# 十六进制# 浮点数float:3.14infinity:.inf# 无穷大not_a_number:.NaN

时间类型

date:2023-12-25datetime:2023-12-25T14:30:00Ziso_datetime:2023-12-25T14:30:00+08:00

注释

# 这是单行注释key:value# 行内注释# 多行注释需要每行都用 ## 这是第二行注释

YAML vs JSON vs XML

示例对比

YAML:

person:name:Johnage:30hobbies:-reading-swimmingaddress:city:New Yorkzip:"10001"

JSON:

{"person":{"name":"John","age":30,"hobbies":["reading","swimming"],"address":{"city":"New York","zip":"10001"}}}

XML:

<person><name>John</name><age>30</age><hobbies><hobby>reading</hobby><hobby>swimming</hobby></hobbies><address><city>New York</city><zip>10001</zip></address></person>

使用场景

1. 配置文件

# Docker Compose 示例version:'3.8'services:web:image:nginx:latestports:-"80:80"volumes:-./html:/usr/share/nginx/htmldb:image:postgres:13environment:POSTGRES_PASSWORD:secret

2. CI/CD 配置

# GitHub Actions 示例name:CI Pipelineon:[push,pull_request]jobs:test:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v2-name:Run testsrun:npm test

3. Kubernetes 配置

# Kubernetes DeploymentapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.14.2ports:-containerPort:80

最佳实践

1. 一致的缩进

  • 使用 2 个空格(推荐)或 4 个空格
  • 不要混用制表符和空格

2. 键命名规范

# 使用小写和下划线api_key:"value"database_name:"prod_db"

3. 避免复杂嵌套

# 不好level1:level2:level3:level4:value:too_deep# 更好(如果可能)flat_structure:level1_level2_level3_level4_value:data

4. 使用引用减少重复

# 定义通用配置common_settings:&commontimeout:30retries:3# 复用service_a:<<:*commonendpoint:"/api/a"service_b:<<:*commonendpoint:"/api/b"

常用工具

1. 验证工具

  • yamllint: YAML 语法检查器
  • yq: YAML 的 jq(命令行处理工具)

2. 转换工具

# YAML 转 JSONpython -c'import yaml, json, sys; print(json.dumps(yaml.safe_load(sys.stdin)))'<file.yaml# JSON 转 YAMLpython -c'import yaml, json, sys; print(yaml.dump(json.load(sys.stdin)))'<file.json

3. 编辑器支持

  • VS Code(YAML 扩展)
  • IntelliJ IDEA / PyCharm
  • Sublime Text
  • Vim / Emacs

常见陷阱

1. 缩进错误

# 错误:混用空格和制表符data:key:value# 4个空格tab:value# 制表符(危险!)

2. 布尔值歧义

# 这些会被解析为字符串,而不是布尔值yes_as_bool:yes# 实际是字符串 "yes"no_as_bool:"no"# 明确字符串true_as_bool:true# 布尔值 true

3. 数字作为字符串

# 如果需要将数字保持为字符串,使用引号zip_code:"10001"# 字符串postal_code:10001# 数字

安全注意事项

1. 避免执行任意代码

# 危险!某些解析器支持执行代码danger:!!python/object/apply:os.system["rm -rf /"]

2. 使用安全加载

# Python 示例:使用 safe_load 而不是 loadimportyaml# 安全data=yaml.safe_load(yaml_content)# 危险data=yaml.load(yaml_content,Loader=yaml.Loader)

YAML 的简洁性和可读性使其成为现代开发中不可或缺的工具,特别是在 DevOps、云原生应用和配置管理领域。掌握 YAML 可以显著提高工作效率和配置文件的维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 20:29:42

幻境·流金开源可部署:支持LoRA微调+ControlNet扩展的完整工具链

幻境流金开源可部署&#xff1a;支持LoRA微调ControlNet扩展的完整工具链 1. 开篇介绍&#xff1a;重新定义影像创作体验 「幻境流金」不仅仅是一个图像生成工具&#xff0c;更是一个完整的创作生态系统。它融合了DiffSynth-Studio的高端渲染技术与Z-Image审美基座&#xff0…

作者头像 李华
网站建设 2026/2/14 10:21:34

Qwen3-ASR-1.7B应用场景:从会议记录到语音助手的蜕变

Qwen3-ASR-1.7B应用场景&#xff1a;从会议记录到语音助手的蜕变 你有没有经历过这样的场景&#xff1f;一场重要的会议开了两个小时&#xff0c;你一边听一边疯狂打字记录&#xff0c;结果会后整理时发现&#xff0c;关键信息漏记了&#xff0c;发言人的原话也记不清了。或者…

作者头像 李华
网站建设 2026/2/10 20:21:54

深度学习项目训练环境:轻松搞定模型训练与推理

深度学习项目训练环境&#xff1a;轻松搞定模型训练与推理 你是不是也曾在搭建深度学习环境时&#xff0c;被各种依赖、版本冲突搞得焦头烂额&#xff1f;从安装CUDA、cuDNN&#xff0c;到配置Python、PyTorch&#xff0c;再到安装各种数据处理的库&#xff0c;每一步都可能是…

作者头像 李华
网站建设 2026/2/15 2:59:26

隐私无忧!Qwen3-ASR-0.6B本地语音识别工具上手体验

隐私无忧&#xff01;Qwen3-ASR-0.6B本地语音识别工具上手体验 最近在整理会议录音和访谈素材时&#xff0c;我一直在寻找一个既好用又能保护隐私的语音转文字工具。市面上的在线服务要么有次数限制&#xff0c;要么总让人担心音频数据的安全。直到我发现了这个基于 Qwen3-ASR…

作者头像 李华
网站建设 2026/2/10 20:19:10

人脸识别实战:Retinaface+CurricularFace镜像快速部署指南

人脸识别实战&#xff1a;RetinafaceCurricularFace镜像快速部署指南 你是否试过在本地部署一个人脸识别模型&#xff0c;结果卡在环境配置上一整天&#xff1f;装完CUDA又报PyTorch版本冲突&#xff0c;调通RetinaFace却发现CurricularFace缺依赖&#xff0c;最后连第一张图片…

作者头像 李华
网站建设 2026/2/10 20:18:21

Pi0具身智能应用:教学演示场景搭建指南

Pi0具身智能应用&#xff1a;教学演示场景搭建指南 1. 为什么教学场景特别需要Pi0这样的具身智能模型 在机器人教学和AI课程中&#xff0c;一个长期存在的痛点是&#xff1a;学生想理解“具身智能”到底是什么&#xff0c;但实验室里没有真实机器人&#xff0c;或者机器人太贵…

作者头像 李华