JSON e YAML: stessi dati, due stili
Per convertire da JSON a YAML conviene sapere che i due formati descrivono le stesse cose: oggetti (in YAML si chiamano mappature), liste, stringhe, numeri, booleani e null. Il JSON usa graffe, parentesi quadre, virgolette e virgole. Lo YAML usa rientri e trattini, il che lo rende più corto e più facile da leggere e modificare a mano. Per questo strumenti come Kubernetes, Docker Compose, GitHub Actions e Ansible usano lo YAML per la configurazione, mentre le API di solito parlano JSON.
Capita spesso di dover passare dall’uno all’altro. Un’API restituisce JSON e tu lo vuoi in un file di configurazione. Oppure una configurazione YAML va inviata a un programma che legge solo JSON. Questo convertitore fa entrambe le cose.
Come si usa
- Scegli la direzione con il pulsante Da JSON a YAML o Da YAML a JSON.
- Incolla i dati nel riquadro a sinistra, premi Apri file, oppure premi Esempio. Il risultato compare a destra mentre scrivi.
- Scegli un Rientro di 2 o 4 spazi. Nella direzione da YAML a JSON c’è anche l’opzione Minificato.
- Da JSON a YAML, attiva Ordina chiavi dalla A alla Z per mettere le chiavi in ordine alfabetico.
- Premi Copia, oppure Scarica per salvare un file
.yamlo.json.
Quando cambi direzione, il risultato attuale passa nell’input, così puoi convertire avanti e indietro per verificare un’andata e ritorno.
Esempio da JSON a YAML
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
diventa:
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
Virgolette sicure
Alcune stringhe sembrano di un altro tipo agli occhi di un parser YAML. Il convertitore le mette tra virgolette perché restino stringhe. Questo JSON:
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
diventa:
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
Senza virgolette, 02134 perderebbe lo zero iniziale, 1.10 diventerebbe il numero 1.1, e un vecchio parser YAML 1.1 (PyYAML e molti strumenti di CI seguono quelle regole) leggerebbe yes come true. Il convertitore segue le regole più rigide sulle virgolette, così il risultato viene letto allo stesso modo dai parser vecchi e nuovi. Le date come "2024-01-15" vanno tra virgolette per lo stesso motivo.
Esempio da YAML a JSON
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
diventa:
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
Il commento è sparito, perché il JSON non ha commenti, e ~ è l’abbreviazione YAML per null.
Le merge key vengono risolte. Questo file in stile Rails:
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
produce:
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
Due documenti separati da --- (per esempio kind: Service e kind: Deployment) diventano un unico array. Con l’opzione Minificato si legge [{"kind":"Service"},{"kind":"Deployment"}].
Come vengono letti i valori
Da YAML a JSON vengono usate le regole di YAML 1.2. Secondo queste regole yes, no e on sono semplici stringhe, solo true e false sono booleani, e le date restano stringhe. Questo input:
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
viene convertito (minificato) in:
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
Nota che 010 viene letto come dieci, e 0o10 è la notazione ottale di otto.
Se un valore deve restare testo, mettilo tra virgolette nello YAML.
Consigli per un’andata e ritorno pulita
- Convertire da JSON a YAML e ritorno dà gli stessi dati, ma non sempre lo stesso testo. L’ordine delle chiavi viene mantenuto, a meno che tu non attivi Ordina chiavi dalla A alla Z.
- Commenti, ancore e tag personalizzati dello YAML non hanno un equivalente in JSON. Le ancore vengono espanse in copie complete dei dati.
- I numeri interi molto grandi, come gli ID di 20 cifre, restano esatti da JSON a YAML dove il browser lo consente. Da YAML a JSON passano per i numeri di JavaScript, quindi salva gli ID lunghi come stringhe tra virgolette.
- I tuoi file restano sul tuo dispositivo. Niente viene caricato.
Errori
Gli errori vengono segnalati con riga e colonna, e Mostra nell’input ti porta al punto giusto. Una virgola finale nel JSON dà Riga 3, colonna 1: La virgola prima di "}" non è ammessa. Nello YAML, una chiave ripetuta dà Map keys must be unique, e le tabulazioni usate per il rientro vengono rifiutate perché lo YAML ammette solo spazi.
Altri modi per convertire
yq. La versione in Go di yq converte dalla riga di comando: accetta JSON in ingresso perché il JSON è YAML valido, e può stampare l’uno o l’altro formato.
Python. Con il pacchetto PyYAML, yaml.safe_dump(json.load(f)) scrive YAML a partire da un file JSON. PyYAML segue YAML 1.1, quindi controlla stringhe come yes e no.
VS Code. Diverse estensioni aggiungono comandi per convertire una selezione tra JSON e YAML.
Strumenti correlati
Per riordinare un file YAML senza convertirlo, usa il formattatore YAML. Per controllare o formattare prima il JSON, usa il formattatore JSON. Per i dati di un foglio di calcolo, parti dal convertitore da CSV a JSON.