YAML in JSON
Mehrdokument-Streams, und ein Schalter für die Boolean-Falle von YAML 1.1.
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.