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:

MerkmalYAMLJSONXML
LesbarkeitHochMittelNiedrig
KommentarunterstützungUnterstütztNicht unterstütztUnterstützt
SyntaxkomplexitätNiedrigMittelHoch
Häufige AnwendungsfälleKonfigurationsdateienDatenaustausch / APIDokument / 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

StyleFunktionenAnwendbare Szenarien
BlockBessere Lesbarkeit, klare HierarchieStrukturell komplexe Daten mit tiefer Verschachtelung
FlowKompakter, in einer einzigen Zeile ausgedrücktEinfache 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:

SzenarioBeispielBeschreibung
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

SpracheGängige BibliothekenFunktionen
PythonPyYAML、ruamel.yamlPyYAML ist am beliebtesten, ruamel.yaml unterstützt YAML 1.2
JavaScript / Node.jsjs-yamlFunktioniert sowohl in Browser- als auch in Node.js-Umgebungen
JavaSnakeYAMLDie standardmäßig in Spring Boot verwendete YAML-Parsing-Bibliothek
Gogopkg.in/yaml.v3Die am häufigsten verwendete YAML-Bibliothek im Go-Ökosystem
RubyPsychIn die Standardbibliothek integriert, keine zusätzliche Installation erforderlich

Empfohlene Editor-Plugins

EditorEmpfohlenes PluginFunktionen
VSCodeYAML-Plugin von Red HatSyntaxhervorhebung, Formatvalidierung, Schema-Validierung
IntelliJ IDEA / PyCharmIntegrierte UnterstützungKeine zusätzliche Installation erforderlich, funktioniert sofort
Sublime TextYAML-bezogene PluginsVerbessert die Syntaxhervorhebung und Formatierung