Skip to content

Guida

Convertire YAML in JSON nel codice

Quando la conversione appartiene a uno script o a una fase di build anziché a una scheda del browser, questi sono gli equivalenti.

Di yamltojsonfree · Pubblicato il · Aggiornato il

Python, Node.js, Go e la riga di comando

Ogni frammento legge input.yaml e stampa JSON formattato. Non sono però intercambiabili — la nota sotto ciascuno dice quale versione di YAML implementa quella libreria, e quella differenza può cambiare i tuoi dati in silenzio.

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 implementa YAML 1.1, quindi qui no diventa False — a differenza dello strumento nel browser, che usa 1.2 di default.

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 usa YAML 1.2 di default — lo stesso motore e le stesse impostazioni dello strumento di questo sito.

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 converte tramite i tag JSON, che è ciò che usa Kubernetes stesso.

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

Questo è mikefarah/yq. L’altro yq (kislyuk) è un wrapper di jq con opzioni diverse.

Tre cose da fare bene in uno script

Usa il loader sicuro. In Python, yaml.load() senza un loader esplicito può costruire oggetti Python arbitrari da YAML con tag — cioè esecuzione di codice se l’input non è tuo. safe_load() analizza solo dati semplici, e non c’è quasi mai motivo di usare altro.

Conosci la tua versione di YAML. PyYAML legge YAML 1.1, quindi country: NO esce come False; js-yaml v5 e il parser Go in stile Kubernetes leggono 1.2, quindi la stessa riga resta una stringa. Una pipeline che converte con una libreria e valida con un’altra può contraddirsi da sola. L’elenco completo dei valori interessati è nella guida YAML 1.1 contro 1.2.

Gestisci i flussi multi-documento. L’output di Kubernetes e Helm è di solito composto da più documenti separati da ---. Un semplice load legge solo il primo e scarta il resto in silenzio — usa yaml.safe_load_all() in Python, loadAll() in js-yaml, oppure l’invocazione di yq mostrata sopra per ottenere ogni documento.

Oppure salta del tutto lo script

Per una conversione una tantum, il convertitore gratuito da YAML a JSON fa tutto quanto sopra nel browser: flussi multi-documento, anchor e merge key, modalità YAML 1.1 e 1.2, ed errori fissati alla riga esatta. Niente viene caricato — il parser gira interamente sul tuo computer.

Riferimenti