Zum Inhalt springen
jsonbeautifiers
Deutsch

YAML in JSON

Mehrdokument-Streams, und ein Schalter für die Boolean-Falle von YAML 1.1.

YAML
JSON

Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen

Wandeln Sie YAML in JSON um, mit Unterstützung für mehrere Dokumente und einem Schalter für die Typregeln, die die meiste Verwirrung stiften.

In dieser Richtung geht es schief, und fast alles läuft darauf hinaus, welche YAML-Version Ihre übrigen Werkzeuge implementieren.

Das Norwegen-Problem, vorgeführt

In YAML 1.1 sind die nackten Wörter no, yes, on, off, y und n Boolesche Werte. Eine Länderliste, die NO für Norwegen enthält, wird also als false gelesen. In YAML 1.2 sind es gewöhnliche Zeichenketten.

Das zählt, weil der Bruch quer durch das gesamte Ökosystem läuft. PyYAML, Psych in Ruby und mehrere ältere Werkzeuge implementieren 1.1. js-yaml, yaml.v3 in Go und die meisten modernen Parser implementieren 1.2. Dieselbe Datei bedeutet je nach Leser etwas anderes.

Sie können die Typregeln hier umschalten und einem Wert beim Umkippen zusehen. Gemessen mit js-yaml 5.4.1: `a: no` ergibt unter YAML 1.2 die Zeichenkette "no" und unter YAML 1.1 den Booleschen Wert false. Selbst im 1.2-Modus warnt dieses Werkzeug, wenn es ein unquotiertes no oder yes sieht, denn das nächste Werkzeug in Ihrer Kette könnte anderer Meinung sein.

Die übrigen Dinge, die YAML hat und JSON nicht

Kommentare
Dauerhaft verloren. JSON hat keine Kommentarsyntax. Wenn Sie das YAML von Hand pflegen, ist das eine Einbahnkonvertierung.
Anker und Aliase
Werden inline ausgefaltet. Ein Dokument, das einen Anker fünfmal benutzt, wird im JSON zu fünf Kopien und kann dadurch erheblich größer werden.
Zeitstempel
YAML löst datumsförmige Skalare zu echten Daten auf. JSON hat keinen Datumstyp, also werden sie als ISO-8601-Zeichenketten geschrieben. Wählen Sie die JSON-Typregeln, damit sie von Anfang an einfache Zeichenketten bleiben.
Schlüssel, die keine Zeichenketten sind
YAML erlaubt eine Zahl oder sogar eine Sequenz als Mapping-Schlüssel. JSON nicht, also werden sie in Zeichenketten umgewandelt.
.inf und .nan
Ohne JSON-Entsprechung, sie werden daher zu null.
Mehrere Dokumente
Ein durch --- getrennter Stream enthält mehrere Dokumente. Standardmäßig wird das erste umgewandelt und Ihnen gesagt, dass es weitere gab; schalten Sie „alle Dokumente“ ein, um ein Array zu bekommen.

Tabulatoren

YAML verbietet Tabulatoren zur Einrückung, absolut und ausnahmslos. Es ist der mit Abstand häufigste YAML-Fehler, und er entsteht, weil ein Editor so eingestellt ist, dass er Tabulatoren einfügt. Dieses Werkzeug warnt vor Tabulatoren, bevor es überhaupt zu parsen versucht, denn die Meldung, die dann irgendein Parser ausgibt, hilft niemandem.

How to do this in code

Umwandeln im Code, und das Sicherheitsargument, das dazugehört.

py Python

PyYAML implementiert YAML 1.1 - hier wird also aus "no" ein False.

import yaml, json

# safe_load, never load. yaml.load can construct arbitrary Python
# objects and has been a real remote-code-execution vector.
data = yaml.safe_load(text)
print(json.dumps(data, indent=2, default=str))

# default=str handles the datetime objects PyYAML produces for
# date-shaped scalars, which json.dumps otherwise refuses.
sh Shell
yq -o=json eval . input.yaml > output.json

# Every document of a multi-document stream
yq -o=json eval-all '[.]' input.yaml
js JavaScript

js-yaml implementiert YAML 1.2, hier bleibt "no" also eine Zeichenkette.

import { load, loadAll } from 'js-yaml';

const data = load(text);              // YAML 1.2 core schema
const docs = loadAll(text);           // multi-document stream
go Go
import "gopkg.in/yaml.v3"

var v any
if err := yaml.Unmarshal(data, &v); err != nil { return err }
out, _ := json.MarshalIndent(v, "", "  ")

Häufige Fragen

Warum ist mein Wert zu true oder false geworden?
Sie lesen ihn mit einem YAML-1.1-Parser, in dem no, yes, on, off, y und n Boolesche Werte sind. Setzen Sie den Wert in Anführungszeichen, oder nehmen Sie einen YAML-1.2-Parser. Schalten Sie oben die Typregeln um, um den Unterschied an Ihrem eigenen Dokument zu sehen.
Wo sind meine Kommentare hin?
JSON hat keine Kommentare, sie werden also verworfen. Daran führt kein Weg vorbei. Ist das YAML eine Datei, die Sie pflegen, behalten Sie sie als Quelle der Wahrheit und erzeugen Sie das JSON daraus.
Warum ist yaml.load in Python unsicher?
Weil es aus Tags im Dokument beliebige Python-Objekte erzeugen kann, wodurch das Parsen von nicht vertrauenswürdigem YAML dem Ausführen gleichkommt. Nehmen Sie immer safe_load.