YAML-VollnameYAML Ain't Markup Language(ein rekursives Akronym), ist ein menschenlesbares Daten-Serialisierungsformat.
YAML wird häufig für Konfigurationsdateien, Datenaustausch und verschiedene Szenarien verwendet, in denen Daten strukturiert gespeichert werden müssen.
Die Syntax von YAML ähnelt anderen High-Level-Sprachen und kann Listen, Hash-Tabellen, Skalare und andere Datenformen leicht ausdrücken.
Es verwendet Einrückung durch Leerzeichen und setzt stark auf das Erscheinungsbild, wodurch es sich besonders für das Ausdrücken oder Bearbeiten von Datenstrukturen, verschiedenen Konfigurationsdateien, das Dumpen von Debug-Inhalten und Dateigliederungen eignet.
Die Dateiendung für YAML-Konfigurationsdateien ist.yml, z. B.:example.yml 。

Merkmale und Vorteile von YAML
Zu den Designzielen von YAML gehören hohe Lesbarkeit, eine prägnante Syntax, die Nähe zu natürlichsprachlichen Schreibgewohnheiten und dass nahezu keine zusätzlichen Symbole benötigt werden.
Im Vergleich zu XML und JSON reduziert YAML viele Klammern und Anführungszeichen, was das Schreiben erleichtert.
Es unterstützt komplexe Datenstrukturen, kann Listen, Dictionaries, verschachtelte Strukturen ausdrücken und unterstützt sogar fortgeschrittene Funktionen wie Referenzen und Anker.
Nahezu alle gängigen Programmiersprachen verfügen über Bibliotheken zum Parsen von YAML, und das Ökosystem ist sehr ausgereift.
Vergleich von YAML mit JSON und XML
Die drei Formate haben ihre eigenen Schwerpunkte; die folgende Tabelle vergleicht sie über mehrere Dimensionen hinweg:
| Merkmal | YAML | JSON | XML |
|---|---|---|---|
| Lesbarkeit | Hoch | Mittel | Niedrig |
| Kommentarunterstützung | Unterstützt | Nicht unterstützt | Unterstützt |
| Syntaxkomplexität | Niedrig | Mittel | Hoch |
| Häufige Anwendungsfälle | Konfigurationsdateien | Datenaustausch / API | Dokument / Datenaustausch |

Häufige Anwendungsfälle für YAML
YAML ist im modernen Entwicklungs-Stack nahezu allgegenwärtig; hier sind die häufigsten Szenarien:
Anwendungskonfigurationsdateien, wie z. B. die von Spring Bootapplication.yml。
Container-Orchestrierungswerkzeuge, wie z. B. Bereitstellungsbeschreibungsdateien für Docker Compose und Kubernetes.
CI/CD-Pipeline-Konfiguration, wie z. B. Workflow-Definitionen für GitHub Actions, GitLab CI und CircleCI.
Front Matter für Generatoren für statische Websites, wie z. B. Seitenmetadaten für Jekyll und Hugo.
Grundlegende Syntaxregeln
Beherrsche die grundlegendsten Schreibregeln von YAML, einschließlich Einrückung, Kommentaren, Dateistruktur usw.
Einrückungsregeln
YAML verwendetLeerzeichenzur Einrückung, um Hierarchie darzustellen,die Tab-Taste darf nicht verwendet werden。
Elemente auf derselben Ebene müssen denselben Einrückungsbetrag beibehalten; es wird normalerweise empfohlen, 2 Leerzeichen als Einrückungseinheit zu verwenden.
person: name: 张三 age: 25
Grundlegende Syntax
Die folgenden Kern-Syntaxregeln von YAML müssen Sie sich merken:
- Groß-/Kleinschreibung wird unterschieden
- Verwenden Sie Einrückung, um Hierarchie darzustellen
- Bei der Einrückung sind keine Tabs erlaubt, nur Leerzeichen
- Die Anzahl der Leerzeichen für die Einrückung ist nicht wichtig, solange Elemente auf derselben Ebene linksbündig ausgerichtet sind
- #Kennzeichnet einen Kommentar.
- :Nach dem Symbol muss ein Leerzeichen stehen
Groß-/Kleinschreibung
Schlüsselnamen, Zeichenfolgen usw. in YAML sind groß-/kleinschreibungssensitiv.
Nameundnamewerden als zwei verschiedene Schlüssel behandelt; Sie müssen beim Schreiben auf Konsistenz achten.
Kommentarsyntax
Verwenden Sie#Inhalt am Anfang ist ein Kommentar; Kommentare können eine ganze Zeile einnehmen oder nach dem Inhalt platziert werden.
# 这是一行注释 name: 张三 # 这也是注释
Dateiendungen
YAML-Dateien verwenden normalerweise.yamloder.ymlals Erweiterung; es gibt keinen wesentlichen Unterschied zwischen den beiden, abhängig von den Projektkonventionen.
Dokumenttrennzeichen
---Wird verwendet, um den Beginn eines neuen Dokuments zu markieren, besonders wichtig in Multi-Dokument-Dateien.
...Wird verwendet, um das Ende eines Dokuments zu markieren, und ist eine optionale Markierung.
--- doc: 第一个文档 --- doc: 第二个文档
Grundlegende Datentypen
YAML unterstützt grundlegende Datentypen wie Zeichenketten, Zahlen, boolesche Werte und Nullwerte; jeder Typ hat eine spezifische Schreibweise.
Datentypübersicht
YAML unterstützt die folgenden Datentypen:
- Objekte: eine Sammlung von Schlüssel-Wert-Paaren, auch bekannt als Mapping / Hashes / Dictionary
- Arrays: eine Menge von Werten in geordneter Reihenfolge, auch bekannt als Sequenz / Liste
- Skalare: einzelne, unteilbare Werte
Skalar
Skalare sind die grundlegendsten Dateneinheiten in YAML und werden in die folgenden Typen unterteilt:
Zeichenketten
Strings können ohne Anführungszeichen geschrieben oder in doppelte oder einfache Anführungszeichen gesetzt werden.
Doppelte Anführungszeichen unterstützen Escape-Zeichen (wie\n), während einfache Anführungszeichen kein Escaping unterstützen.
name: 张三 # 不加引号 name: "张三" # 双引号,支持转义字符 name: '张三' # 单引号,不支持转义
Zahlen
YAML erkennt Ganzzahlen und Gleitkommazahlen automatisch, ohne dass Typen deklariert werden müssen.
age: 25 # 整数 price: 19.99 # 浮点数
Boolesche Werte
Boolesche Werte verwendentrueundfalsezur Darstellung.
is_active: true is_deleted: false
Null
Null kann mitnull、~dargestellt werden oder indem nichts geschrieben wird, um es anzugeben.
value: null value: ~ value: # 什么都不写也表示 null
Umfassendes Skalar-Beispiel
Das folgende Beispiel zeigt, wie alle Skalartypen verwendet werden, einschließlich boolescher Werte, Gleitkommazahlen, Ganzzahlen, Null, Strings, Datumsangaben und Uhrzeiten:
boolean:
- TRUE # true,True 都可以
- FALSE # false,False 都可以
float:
- 3.14
- 6.8523015e+5 # 可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 # 二进制表示
null:
nodeName: 'node'
parent: ~ # 使用 ~ 表示 null
string:
- 哈哈
- 'Hello world' # 可以使用双引号或者单引号包裹特殊字符
- newline
newline2 # 字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 # 日期必须使用 ISO 8601 格式,即 yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 # 时间使用 ISO 8601 格式,时间和日期之间使用 T 连接,最后使用 + 代表时区
Datums- und Uhrzeitangaben müssen das ISO-8601-Format verwenden. Das Datumsformat istyyyy-MM-dd, das Uhrzeitformat istyyyy-MM-ddTHH:mm:ss+timezone, wobei in der MitteTzur Verbindung dient.
Mehrzeilige Zeichenketten
YAML bietet zwei Möglichkeiten, mehrzeilige Strings zu schreiben, die jeweils für unterschiedliche Szenarien geeignet sind.
Gefalteter Stil (>)
Verwenden Sie das>Symbol, um mehrzeiligen Text in eine Zeile zu falten; Zeilenumbruchzeichen werden durch Leerzeichen ersetzt.
description: > 这是第一行 这是第二行 这是第三行
Die obige Schreibweise entspricht:"This is the first line This is the second line This is the third line\n"
Literal-Stil (|)
Die Verwendung des|-Symbols bewahrt die ursprünglichen Zeilenumbrüche und eignet sich zum Schreiben von mehrzeiligem Text (z. B. Skriptinhalt).
script: | echo "第一行" echo "第二行" echo "第三行"
Vergleich von | und >
Unten wird derselbe InhaltFoo\nBarverwendet, um die Unterschiede zwischen den beiden Stilen zu vergleichen:
this: | Foo Bar that: > Foo Bar
In JavaScript-Code umgewandelt wie folgt:
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
Es ist zu sehen, dass|Zeilenumbrüche beibehält, was zuFoo\nBar\nführt; während>Zeilenumbrüche zu Leerzeichen faltet, was zuFoo Bar\n führt。
Die Wahl zwischen>oder|hängt von Ihren Bedürfnissen ab: Wenn Sie mehrzeiligen Inhalt zu einem Absatz zusammenfassen möchten, verwenden Sie>; wenn Sie das ursprüngliche Zeilenumbruchformat beibehalten möchten (z. B. Skripte, Gedichte), verwenden Sie|。
Zusammengesetzte Datenstrukturen
YAML unterstützt zwei zusammengesetzte Strukturen: Mappings und Sequenzen. Sie können frei verschachtelt werden, um beliebig komplexe Datenbeziehungen auszudrücken.
Mapping / Dictionary
Ein Mapping ist eine Sammlung von Schlüssel-Wert-Paaren und die am häufigsten verwendete Datenstruktur in YAML.
Grundlegende Syntax für Schlüssel-Wert-Paare
name: 张三 age: 25 city: 北京
Verschachteltes Mapping
Durch Einrückung können Sie ein weiteres Mapping innerhalb eines Mappings verschachteln, wodurch eine hierarchische Struktur entsteht.
person:
name: 张三
address:
city: 北京
zipcode: "100000"
Mapping-Syntax im Flow-Stil
Sie können auch diekey:{key1: value1, key2: value2, ...}Flow-Stil-Syntax verwenden.
key: {child-key: value, child-key2: value2}
Komplexer Schlüssel
Verwenden Sie ein Fragezeichen, gefolgt von einem Leerzeichen, um einen komplexen Schlüssel darzustellen, gepaart mit einem Doppelpunkt und einem Leerzeichen, um einen Wert darzustellen:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
Das bedeutet, die Eigenschaft des Objekts ist ein Array[complexkey1, complexkey2], und der entsprechende Wert ist ebenfalls ein Array[complexvalue1, complexvalue2]。
Sequenz / Liste
Präfixnotation-zum Speichern geordneter Datensammlungen.
Grundlegende Listen-Syntax
fruits: - 苹果 - 香蕉 - 橙子
Verschachtelte Listen
matrix: - [1, 2, 3] - [4, 5, 6] - [7, 8, 9]
Mehrdimensionale Arrays
YAML unterstützt mehrdimensionale Arrays, die inline dargestellt werden können:
key: [value1, value2, ...]
Wenn ein Unterelement der Datenstruktur ein Array ist, können Sie unter diesem Element um ein Leerzeichen einrücken:
- - A - B - C
Komplexes Beispiel, bei dem die Array-Elemente Objekte sind
Ein häufiges reales Szenario: Jedes Element im Array ist ein Objekt, das aus mehreren Eigenschaften besteht:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
Das bedeutet, die Eigenschaftcompaniesist ein Array, und jedes Array-Element besteht ausid、name、pricedrei Eigenschaften.
Arrays können auch im Flow-Stil dargestellt werden:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
Mischen von Mappings und Sequenzen
Mappings und Sequenzen können flexibel kombiniert werden, um komplexe Datenstrukturen auszudrücken.
students:
- name: 张三
age: 20
subjects:
- 数学
- 英语
- name: 李四
age: 22
subjects:
- 物理
- 化学
Im obigen Beispiel iststudentseine Sequenz, jedes Element ist ein Mapping, undsubjectsdes Mappings ist wiederum eine Sequenz. Diese Art verschachtelter Kombination ist der Kern der Ausdrucksstärke von YAML.
Beispiel für eine zusammengesetzte Struktur
Arrays und Objekte können zusammengesetzte Strukturen bilden. Das folgende ist ein Beispiel, das sowohl eine Liste als auch ein Mapping enthält:
languages: - Ruby - Perl - Python websites: YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org
Nach der Konvertierung in JSON:
{
languages: [ 'Ruby', 'Perl', 'Python'],
websites: {
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}
Flow-Syntax
Neben der Blocknotation unterstützt YAML auch die JSON-ähnliche Flow-Notation, die für kompakte Szenarien geeignet ist.
Flow-Mapping
Verwenden Sie geschweifte Klammern{}, um Schlüssel-Wert-Paare einzuschließen, die durch Kommas getrennt werden.
person: {name: 张三, age: 25, city: 北京}
Flow-Sequenz
Verwenden Sie eckige Klammern[], um Elemente einzuschließen, die durch Kommas getrennt werden.
fruits: [苹果, 香蕉, 橙子]
Vergleich und Anwendungsfälle von Flow- und Block-Stilen
| Style | Funktionen | Anwendbare Szenarien |
|---|---|---|
| Block | Bessere Lesbarkeit, klare Hierarchie | Strukturell komplexe Daten mit tiefer Verschachtelung |
| Flow | Kompakter, in einer einzigen Zeile ausgedrückt | Einfache Daten oder kleine Daten, die in Blockstrukturen eingebettet sind |
Die beiden Stile können auch gemischt werden:
users:
- {name: 张三, age: 25}
- {name: 李四, age: 30}
Erweiterte Funktionen
YAML bietet erweiterte Funktionen wie Anker, Referenzen und Merge-Schlüssel, um doppelte Inhalte zu reduzieren.
Anker und Referenzen
Verwende&, um einen Anker zu definieren, und verwende*, um auf den Anker zu verweisen, wodurch wiederholtes Schreiben desselben Inhalts vermieden wird.
default_settings: &defaults adapter: postgres host: localhost development: <<: *defaults database: dev_db test: <<: *defaults database: test_db
Im obigen Beispiel definiert&defaultseinen Anker,*defaultsverweist auf den Inhalt dieses Ankers,<<was das Zusammenführen in die aktuellen Daten anzeigt.
Die obige Konfiguration wird erweitert zu:
defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
Ankerreferenzen in Listen
Anker können auch in Listen verwendet werden:
- &showell Steve - Clark - Brian - Oren - *showell
Nach der Konvertierung in ein JavaScript-Array:
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
Merge-Schlüssel
<<Wird verwendet, um den Inhalt eines Mappings in das aktuelle Mapping zusammenzuführen, oft in Verbindung mit Ankern verwendet.
Der Merge-Schlüssel<<ist ein Feature der YAML-1.1-Spezifikation und wird von den meisten YAML-Parsern unterstützt. Er kann Konfigurationsdateien prägnanter machen, aber beachte, dass er nicht Teil der JSON-Spezifikation ist und beim Konvertieren in JSON in tatsächlichen Inhalt expandiert wird.
Unterstützung für mehrere Dokumente
In einer YAML-Datei können Sie---verwenden, um mehrere unabhängige Dokumente zu trennen und zu speichern, was häufig in Kubernetes-Konfigurationsdateien vorkommt.
--- kind: Pod metadata: name: pod-1 --- kind: Pod metadata: name: pod-2
Tags und Typkonvertierung
YAML unterstützt die explizite Angabe von Datentypen durch Tags, wobei die!!Präfixdeklaration verwendet wird.
explicit_string: !!str 123 explicit_int: !!int "123" explicit_float: !!float "3.14"
Häufige Tags sind!!str(Zeichenkette),!!int(Ganzzahl),!!float(Gleitkommazahl),!!bool(boolescher Wert),!!null(null), usw.
Häufige Fehler und Vorsichtsmaßnahmen
YAML reagiert sehr empfindlich auf Formatierung. Nachfolgend werden die häufigsten Fehlertypen und ihre Vermeidung beschrieben.
Parsing-Fehler durch Einrückungsfehler
YAML ist extrem empfindlich gegenüber Einrückungen. Die Einrückung auf derselben Ebene muss exakt konsistent sein, sonst kommt es zu Parsing-Fehlern.
# 错误示例:缩进不一致 person: name: 张三 age: 25 # 缩进多了一个空格,会报错
Mischen von Tabs und Leerzeichen
Die YAML-Spezifikation besagt eindeutig, dassTabulatoren nicht zur Einrückung verwendet werden dürfen, und Leerzeichen müssen konsistent verwendet werden, andernfalls melden die meisten Parser einen Fehler.
Es wird empfohlen, die Einstellung "Tab in Leerzeichen umwandeln" im Editor zu aktivieren, um zu vermeiden, dass versehentlich Tab-Zeichen eingemischt werden. Die meisten modernen Editoren unterstützen.yamlund.ymlund aktivieren diese Einstellung für Dateien automatisch.
Sonderzeichen escapen
Wenn eine Zeichenkette:、#、{、}、[、]und andere Sonderzeichen enthält, wird empfohlen, die Zeichenkette in Anführungszeichen zu setzen, damit sie vom Parser nicht falsch beurteilt wird.
title: "标题: 副标题" # 冒号需要用引号包裹 tag: "#重要" # 井号需要用引号包裹,否则会被当作注释
Wann Zeichenketten in Anführungszeichen gesetzt werden sollten
In den folgenden Fällen wird empfohlen, explizit Anführungszeichen hinzuzufügen, um eine falsche Typinferenz durch den YAML-Parser zu vermeiden:
| Szenario | Beispiel | Beschreibung |
|---|---|---|
| Zeichenkette beginnt mit einer Ziffer | "100000" | Ohne Anführungszeichen wird sie als Zahl geparst |
| Leicht zu verwechselnde boolesche Wörter | "true"、"false"、"yes"、"no" | Ohne Anführungszeichen wird sie als boolescher Wert geparst |
| Null-Wörter | "null"、"~" | Ohne Anführungszeichen wird sie als null geparst |
| Enthält Sonderzeichen | "Titel: Untertitel" | Doppelpunkte, Rauten usw. werden fälschlicherweise als Syntaxmarker interpretiert |
Praktische Anwendungen
Verstehen Sie den Einsatz von YAML in realen Projekten anhand vollständiger Beispiele in echten Szenarien.
Eine einfache Konfigurationsdatei schreiben
Das Folgende ist eine typische Anwendungskonfigurationsdatei, die die gängige Struktur von YAML in realen Projekten zeigt:
# 应用基本配置 app: name: MyApplication version: 1.0.0 debug: false # 数据库连接配置 database: host: localhost port: 5432 username: admin password: "secret" # 日志配置 logging: level: info file: /var/log/app.log
YAML in Docker Compose
Docker Compose verwendet YAML, um die Service-Orchestrierung von Multi-Container-Anwendungen zu definieren:
version: "3"
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
YAML in Kubernetes
Kubernetes verwendet YAML, um verschiedene Ressourcenobjekte zu definieren. Das Folgende ist ein Beispiel für eine Pod-Definition:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
YAML in GitHub Actions
GitHub Actions verwendet YAML, um CI/CD-Workflows zu definieren:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run tests
run: npm test
Werkzeuge und Validierung
Empfehlen Sie einige praktische YAML-Tools und -Ressourcen, mit denen Sie YAML-Dateien effizienter schreiben und validieren können.
Online-YAML-Validatoren
YAML Lint ist das am häufigsten verwendete Online-Validierungstool. Sie können nach "yamllint online" suchen, um verfügbare Websites zur Online-Validierung zu finden.
Verschiedene IDEs verfügen außerdem über eine integrierte YAML-Syntaxprüfung, die während des Schreibens Echtzeit-Fehlerhinweise liefert.
YAML-Parsing-Bibliotheken für gängige Programmiersprachen
| Sprache | Gängige Bibliotheken | Funktionen |
|---|---|---|
| Python | PyYAML、ruamel.yaml | PyYAML ist am beliebtesten, ruamel.yaml unterstützt YAML 1.2 |
| JavaScript / Node.js | js-yaml | Funktioniert sowohl in Browser- als auch in Node.js-Umgebungen |
| Java | SnakeYAML | Die standardmäßig in Spring Boot verwendete YAML-Parsing-Bibliothek |
| Go | gopkg.in/yaml.v3 | Die am häufigsten verwendete YAML-Bibliothek im Go-Ökosystem |
| Ruby | Psych | In die Standardbibliothek integriert, keine zusätzliche Installation erforderlich |
Empfohlene Editor-Plugins
| Editor | Empfohlenes Plugin | Funktionen |
|---|---|---|
| VSCode | YAML-Plugin von Red Hat | Syntaxhervorhebung, Formatvalidierung, Schema-Validierung |
| IntelliJ IDEA / PyCharm | Integrierte Unterstützung | Keine zusätzliche Installation erforderlich, funktioniert sofort |
| Sublime Text | YAML-bezogene Plugins | Verbessert die Syntaxhervorhebung und Formatierung |