JSON und YAML: dieselben Daten, zwei Stile
JSON und YAML können dieselben Dinge beschreiben: Objekte (in YAML Mappings genannt), Listen, Strings, Zahlen, Booleans und null. JSON nutzt geschweifte und eckige Klammern, Anführungszeichen und Kommas. YAML nutzt Einrückung und Bindestriche, was es kürzer und von Hand leichter lesbar und bearbeitbar macht. Deshalb nutzen Tools wie Kubernetes, Docker Compose, GitHub Actions und Ansible YAML für die Konfiguration, während APIs meist JSON sprechen.
Oft musst du zwischen beiden wechseln. Eine API liefert JSON, und du willst es in einer Konfigurationsdatei haben. Oder eine YAML-Konfiguration muss an ein Programm, das nur JSON liest. Dieser Konverter kann beides.
So nutzt du ihn
- Wähl die Richtung mit der Schaltfläche JSON in YAML oder YAML in JSON.
- Füge deine Daten in das linke Feld ein, klicke auf Datei öffnen oder auf Beispiel. Das Ergebnis erscheint beim Tippen rechts.
- Wähl eine Einrückung von 2 oder 4 Leerzeichen. In der Richtung YAML in JSON gibt es auch die Option Minifiziert.
- Für JSON in YAML schaltest du Schlüssel von A bis Z sortieren ein, um die Schlüssel alphabetisch zu ordnen.
- Klicke auf Kopieren oder auf Herunterladen, um eine
.yaml- oder.json-Datei zu speichern.
Wenn du die Richtung wechselst, wandert das aktuelle Ergebnis in die Eingabe. So kannst du hin und zurück umwandeln, um eine Rundreise zu prüfen.
Beispiel: JSON in YAML
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
wird zu:
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
Sichere Anführungszeichen
Manche Strings sehen für einen YAML-Parser wie andere Typen aus. Der Konverter setzt sie in Anführungszeichen, damit sie Strings bleiben. Dieses JSON:
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
wird zu:
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
Ohne die Anführungszeichen würde 02134 seine führende Null verlieren, 1.10 würde zur Zahl 1.1, und ein älterer Parser nach YAML 1.1 (PyYAML und viele CI-Tools folgen diesen Regeln) würde yes als true lesen. Berühmt ist das als „Norwegen-Problem“: Der Ländercode NO wird dort zu false. Der Konverter folgt den strengeren Regeln für Anführungszeichen, damit das Ergebnis in alten und neuen Parsern gleich gelesen wird. Datumsangaben wie "2024-01-15" bekommen aus demselben Grund Anführungszeichen. Deutsche Wörter wie „ja“ und „nein“ sind dagegen in keiner YAML-Version ein Boolean und brauchen keinen Schutz.
Beispiel: YAML in JSON
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
wird zu:
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
Der Kommentar ist weg, weil JSON keine Kommentare kennt, und ~ ist die YAML-Kurzform für null.
Merge Keys werden aufgelöst. Diese Datei im Rails-Stil:
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
ergibt:
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
Zwei Dokumente, die durch --- getrennt sind (etwa kind: Service und kind: Deployment), werden zu einem Array. Mit der Option Minifiziert lautet es [{"kind":"Service"},{"kind":"Deployment"}].
Wie Werte gelesen werden
YAML in JSON nutzt die Regeln von YAML 1.2. Danach sind yes, no und on normale Strings, nur true und false sind Booleans, und Datumsangaben bleiben Strings. Diese Eingabe:
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
wird (minifiziert) zu:
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
Beachte, dass 010 als zehn gelesen wird und 0o10 die Oktalschreibweise für acht ist.
Wenn ein Wert Text bleiben muss, setz ihn im YAML in Anführungszeichen. Das gilt auch für deutsche Dezimalzahlen: preis: 2,50 ist in YAML einfach der String „2,50“, preis: 2.50 dagegen die Zahl 2.5.
Tipps für eine saubere Rundreise
- JSON in YAML und zurück ergibt dieselben Daten, aber nicht immer denselben Text. Die Reihenfolge der Schlüssel bleibt erhalten, außer du schaltest Schlüssel von A bis Z sortieren ein.
- YAML-Kommentare, Anker und eigene Tags haben kein Gegenstück in JSON. Anker werden zu vollständigen Kopien der Daten erweitert.
- Sehr große ganze Zahlen, etwa 20-stellige IDs, bleiben bei JSON in YAML exakt, sofern der Browser das unterstützt. Bei YAML in JSON laufen sie durch JavaScript-Zahlen, speichere lange IDs also als Strings in Anführungszeichen.
- Deine Dateien bleiben auf deinem Gerät. Nichts wird hochgeladen.
Fehler
Fehler werden mit Zeile und Spalte gemeldet, und In der Eingabe zeigen springt dorthin. Ein Trailing Comma in JSON ergibt Zeile 3, Spalte 1: Ein Komma direkt vor "}" ist nicht erlaubt. Die Meldungen des YAML-Parsers bleiben Englisch, nur Zeile und Spalte davor sind deutsch: Ein doppelter Schlüssel ergibt Map keys must be unique, und Tabs zur Einrückung werden abgelehnt, weil YAML nur Leerzeichen erlaubt.
Andere Wege zur Umwandlung
yq. Die Go-Version von yq wandelt auf der Kommandozeile um: Sie liest JSON als Eingabe, weil JSON gültiges YAML ist, und kann beide Formate ausgeben.
Python. Mit dem Paket PyYAML schreibt yaml.safe_dump(json.load(f)) YAML aus einer JSON-Datei. PyYAML folgt YAML 1.1, prüf also Strings wie yes und no.
VS Code. Mehrere Erweiterungen ergänzen Befehle, um eine Auswahl zwischen JSON und YAML umzuwandeln.
Ähnliche Tools
Um eine YAML-Datei aufzuräumen, ohne sie umzuwandeln, nimm den YAML Formatter. Um JSON vorher zu prüfen oder schön auszugeben, nimm den JSON Formatter. Für Tabellendaten beginnst du mit CSV in JSON umwandeln.