YAML

1 tools

Datenserialisierungsformate

Datenserialisierung ist der Prozess, strukturierte Daten in ein Format zu konvertieren, das gespeichert oder übertragen und später rekonstruiert werden kann.

JSON, YAML, TOML und XML sind die vier dominierenden textbasierten Serialisierungsformate in der Softwareentwicklung.

JSON und YAML im Vergleich

JSON und YAML repräsentieren das gleiche Datenmodell. YAML ist eine strikte Obermenge von JSON — jedes gültige JSON-Dokument ist auch gültiges YAML.

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
server:
  host: localhost
  port: 8080
  debug: true
database:
  url: postgres://localhost/mydb
  pool: 10

YAML verwendet Einrückung statt Klammern und lässt bei den meisten String-Werten Anführungszeichen weg. Das macht es kompakter und lesbarer für von Menschen bearbeitete Dateien.

Formatvergleich

FormatLesbarkeitKommentareArraysAm besten für
JSON★★★☆☆Keine KommentareNativAPIs, Datenaustausch
YAML★★★★★Ja (#)NativKonfigdateien, IaC
TOML★★★★☆Ja (#)NativApp-Konfiguration (Rust, Python)
XML★★☆☆☆Ja (<!-- -->)Wiederholte ElementeDokumente, SOAP, SVG

YAML-Fallstricke

YAML ist mächtig, hat aber bekannte Sonderfälle, die Entwickler überraschen:

Das Norwegen-Problem

Der bloße Wert 'NO' wird in YAML 1.1 als boolesches false interpretiert. Ländercodes wie NO (Norwegen), OFF, FALSE, N werden alle als false geparst. Mehrdeutige Strings immer in Anführungszeichen setzen.

Einrückungsempfindlichkeit

YAML verwendet Einrückung zur Definition von Struktur. Ein zusätzliches Leerzeichen oder ein Tab kann die Bedeutung eines Dokuments vollständig verändern. Tabs sind in YAML verboten — nur Leerzeichen.

Implizite Typkonvertierung

Werte, die wie Zahlen, Boolean oder null aussehen, werden automatisch konvertiert. Werte, die als Strings erhalten bleiben sollen, in Anführungszeichen setzen.

Tabs sind verboten

Die YAML-Spezifikation verbietet ausdrücklich Tabulatorzeichen für Einrückungen. Den Editor so konfigurieren, dass in YAML-Dateien Leerzeichen verwendet werden.

Mehrzeilige String-Modi

YAML hat zwei Indikatoren für mehrzeilige Strings: | (Literalblock, Zeilenumbrüche erhalten) und > (gefalteter Block, Zeilenumbrüche in Leerzeichen umwandeln).

Anker/Alias-Schleifen

YAML-Anker (&) und Aliase (*) ermöglichen die Wiederverwendung von Knoten, können aber zirkuläre Referenzen erzeugen.

Einzigartige YAML-Funktionen

Kommentare

YAML unterstützt Kommentare mit dem #-Zeichen. Das ist einer der größten praktischen Vorteile gegenüber JSON für Konfigurationsdateien.

Anker und Aliase

YAML ermöglicht es, einen Knoten einmal mit &ankername zu definieren und ihn überall mit *ankername wiederzuverwenden.

Mehrzeilige Strings

YAML unterstützt Block-Skalare mit zwei Modi: der Literalblock (|) erhält Zeilenumbrüche genau wie geschrieben; der gefaltete Block (>) wandelt Zeilenumbrüche in Leerzeichen um.

Wann eine Konvertierung nötig ist

CI/CD-Pipeline-Konfiguration

GitHub Actions, GitLab CI und CircleCI verwenden YAML nativ. Bei der programmatischen Generierung von Pipeline-Konfigurationen ist es oft einfacher, ein JSON-Objekt zu erstellen und nach YAML zu konvertieren.

Kubernetes-Manifeste

Kubernetes-Ressourcen werden in YAML definiert, aber einige Tools produzieren JSON. Die Konvertierung zwischen Formaten ermöglicht die Inspektion von API-Antworten.

API-Antwortverarbeitung

REST-APIs geben JSON zurück. Bei der Übertragung dieser Daten in YAML-basierte Konfigurationssysteme überbrückt ein Konverter die Lücke.

Konfigurationsmigration

Die Migration von einem Tool zu einem anderen bedeutet oft, sein Konfigurationsformat zu konvertieren.

Schema-Validierungs-Workflow

JSON-Schema-Tools sind ausgereifter. Ein gängiges Muster ist, Konfigurationen in YAML zu erstellen und für die Validierung nach JSON zu konvertieren.

Datenaustausch mit APIs

Interne Tools können YAML-Konfigurationen konsumieren, während externe APIs JSON erfordern.

Häufig gestellte Fragen

Ist YAML eine Obermenge von JSON?

Ja. YAML 1.2 ist eine strikte Obermenge von JSON — jedes gültige JSON-Dokument ist auch gültiges YAML.

Warum YAML statt JSON für Konfigurationsdateien wählen?

YAML unterstützt Kommentare, die JSON nicht hat. YAML ist auch kompakter für tief verschachtelte Strukturen.

Was ist TOML und wann sollte es verwendet werden?

TOML ist für Konfigurationsdateien konzipiert mit einer klaren, INI-ähnlichen Syntax mit expliziten Typen. Es ist der Standard für Rust (Cargo.toml) und Python (pyproject.toml).

Gehen bei der JSON-zu-YAML-Konvertierung Informationen verloren?

Selten. JSON bewahrt die Schlüsselreihenfolge in den meisten Parsern. YAML unterstützt Anker und Tags, die kein JSON-Äquivalent haben.

Was verursacht 'undefined' in der JSON-Ausgabe?

JSON.stringify wandelt undefined-Werte in Arrays in null um und lässt sie in Objekten weg.

Kann ich JSON in einer YAML-Datei verwenden?

Ja. Da YAML eine Obermenge von JSON ist, kann JSON-Syntax direkt in einem YAML-Dokument eingebettet werden.