news 2026/6/10 21:03:45

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/6/10 14:33:34

Fun-ASR-MLT-Nano-2512效果对比:31语种识别准确率vs Whisper-large-v3

Fun-ASR-MLT-Nano-2512效果对比&#xff1a;31语种识别准确率vs Whisper-large-v3 语音识别技术正在快速融入我们的日常生活&#xff0c;从手机语音助手到会议纪要转录&#xff0c;再到视频字幕生成&#xff0c;它无处不在。但当我们面对一个多语言混杂的音频&#xff0c;或者…

作者头像 李华
网站建设 2026/6/10 14:35:25

星图平台快速体验:Qwen3-VL:30B多模态模型实战

星图平台快速体验&#xff1a;Qwen3-VL:30B多模态模型实战 1. 开篇&#xff1a;为什么选择Qwen3-VL:30B&#xff1f; 如果你正在寻找一个既能看懂图片又能理解文字的多模态AI助手&#xff0c;Qwen3-VL:30B绝对值得关注。这个模型不仅能回答关于图片的各种问题&#xff0c;还能…

作者头像 李华
网站建设 2026/6/9 15:15:11

阿里云Qwen3-ASR-0.6B:复杂环境下语音识别依然精准

阿里云Qwen3-ASR-0.6B&#xff1a;复杂环境下语音识别依然精准 1. 语音识别的现实挑战与Qwen3-ASR的解决方案 你有没有遇到过这样的场景&#xff1f;在嘈杂的咖啡馆里&#xff0c;想用语音助手记录一个想法&#xff0c;结果它把"下午三点开会"听成了"下午三块…

作者头像 李华
网站建设 2026/6/10 14:47:11

5步搞定AI股票分析:Ollama镜像保姆级教程

5步搞定AI股票分析&#xff1a;Ollama镜像保姆级教程 1. 项目简介&#xff1a;你的私人AI股票分析师 在投资决策过程中&#xff0c;及时获取专业的股票分析至关重要。传统方法需要查阅大量财报、研究市场动态&#xff0c;耗费大量时间和精力。现在&#xff0c;通过本教程&…

作者头像 李华
网站建设 2026/6/10 14:47:07

M2LOrder在智能外呼系统中的应用:实时语音转文本+情绪标签注入CRM

M2LOrder在智能外呼系统中的应用&#xff1a;实时语音转文本情绪标签注入CRM 1. 项目概述 在现代智能客服和外呼系统中&#xff0c;单纯的通话录音和文字记录已经无法满足精细化运营的需求。企业需要更深入地了解客户情绪状态&#xff0c;从而提供更精准的服务和跟进策略。M2…

作者头像 李华
网站建设 2026/6/10 14:46:59

EasyAnimateV5-7b-zh-InP零基础教程:5分钟搭建高分辨率视频生成系统

EasyAnimateV5-7b-zh-InP零基础教程&#xff1a;5分钟搭建高分辨率视频生成系统 你是不是也想过&#xff0c;要是能把一张静态图片变成会动的视频&#xff0c;或者直接用文字描述就生成一段视频&#xff0c;那该多有意思&#xff1f;今天我要分享的这个工具&#xff0c;就能帮…

作者头像 李华