Skip to content

Guide

YAML in Code zu JSON umwandeln

Wenn die Umwandlung in ein Skript oder einen Build-Schritt gehört statt in einen Browser-Tab, sind das die Entsprechungen.

Von yamltojsonfree · Veröffentlicht am · Aktualisiert am

Python, Node.js, Go und die Kommandozeile

Jeder Schnipsel liest input.yaml und gibt formatiertes JSON aus. Austauschbar sind sie trotzdem nicht — der Hinweis unter jedem sagt dir, welche YAML-Version die Bibliothek implementiert, und dieser Unterschied kann deine Daten stillschweigend verändern.

Python

import json, yaml

with open("input.yaml") as f:
    data = yaml.safe_load(f)          # safe_load, never load()

print(json.dumps(data, indent=2))

PyYAML implementiert YAML 1.1, no wird hier also zu False — anders als im Browser-Tool, das standardmäßig 1.2 verwendet.

Node.js

import { readFileSync } from "node:fs";
import { load } from "js-yaml";

const data = load(readFileSync("input.yaml", "utf8"));
console.log(JSON.stringify(data, null, 2));

js-yaml v5 verwendet standardmäßig YAML 1.2 — dieselbe Engine und dieselben Standards wie das Browser-Tool auf dieser Seite.

Go

import (
    "encoding/json"
    "os"
    "sigs.k8s.io/yaml"
)

in, _ := os.ReadFile("input.yaml")
out, _ := yaml.YAMLToJSON(in)
os.Stdout.Write(out)

sigs.k8s.io/yaml konvertiert über JSON-Tags — genau das, was Kubernetes selbst verwendet.

Bash (yq)

# Single document
yq -o=json input.yaml

# Multi-document into a JSON array
yq -o=json -I=2 'select(document_index >= 0)' -N input.yaml

# Minified
yq -o=json -I=0 input.yaml

Das ist mikefarah/yq. Das andere yq (kislyuk) ist ein jq-Wrapper mit anderen Optionen.

Drei Dinge, die in einem Skript stimmen müssen

Nutze den sicheren Loader. In Python kann yaml.load() ohne expliziten Loader aus getaggtem YAML beliebige Python-Objekte erzeugen — das ist Codeausführung, wenn die Eingabe nicht von dir stammt. safe_load() parst nur reine Daten, und es gibt fast nie einen Grund, etwas anderes zu verwenden.

Kenne deine YAML-Version. PyYAML liest YAML 1.1, country: NO kommt also als False heraus; js-yaml v5 und der Kubernetes-Parser in Go lesen 1.2, dieselbe Zeile bleibt ein String. Eine Pipeline, die mit einer Bibliothek konvertiert und mit einer anderen validiert, kann sich selbst widersprechen. Die vollständige Liste betroffener Werte steht im Leitfaden YAML 1.1 vs. 1.2.

Behandle Streams mit mehreren Dokumenten. Kubernetes- und Helm-Ausgaben bestehen meist aus mehreren Dokumenten, getrennt durch ---. Ein einfaches load liest nur das erste und verwirft den Rest stillschweigend — nutze yaml.safe_load_all() in Python, loadAll() in js-yaml oder den oben gezeigten yq-Aufruf, um jedes Dokument zu bekommen.

Oder lass das Skript ganz weg

Für eine einmalige Umwandlung erledigt der kostenlose YAML-zu-JSON-Converter alles oben Genannte im Browser: Streams mit mehreren Dokumenten, Anchors und Merge Keys, YAML-1.1- und 1.2-Modus und Fehler mit exakter Zeile. Nichts wird hochgeladen — der Parser läuft vollständig auf deinem Rechner.

Quellen