JSON vs YAML: Quale formato di configurazione dovresti usare?
Risposta rapida
Utilizza JSON per APIs, scambio di dati e casi in cui è importante un'analisi e una convalida rigorose. Utilizza YAML per file di configurazione, manifest DevOps e casi in cui la leggibilità e i commenti umani sono importanti. YAML è un superset JSON: ogni documento JSON valido è YAML valido.
Introduzione
JSON e YAML sono entrambi formati di serializzazione dei dati leggibili dall'uomo. JSON è rigoroso, minimale e onnipresente nel web APIs. YAML è un superset di JSON che aggiunge commenti, stringhe multilinea, ancoraggi e struttura basata sul rientro, rendendolo popolare per i file di configurazione (Docker Compose, Kubernetes, pipeline CI/CD).
Passo dopo passo
-
Confrontare sintassi e leggibilità
JSON utilizza parentesi graffe e virgolette: {"key": "value"}. YAML utilizza il rientro e i due punti: chiave: valore. YAML è più pulito per la configurazione: non sono necessarie virgolette per le stringhe, né virgole tra gli elementi, né parentesi graffe. JSON è più esplicito e meno soggetto a errori per lo scambio di dati.
-
Confronta le caratteristiche
YAML supporta: commenti (#), stringhe su più righe (|, >), ancore (&) e alias (*), più documenti in un file (---) e tipi complessi. JSON non supporta nessuno di questi: nessun commento, nessuna stringa multilinea, nessun riferimento. La semplicità di JSON è intenzionale: è un formato di scambio dati, non un linguaggio di configurazione.
-
Confronta sicurezza e analisi
L'analisi di JSON è veloce e sicura: JSON.parse è integrato in ogni motore JavaScript. L'analisi YAML è più lenta e complessa: le specifiche YAML sono più di 80 pagine rispetto alle 2 pagine di JSON. YAML presenta rischi per la sicurezza (miliardi di risate attaccano tramite ancore) che JSON no. Utilizza sempre un parser YAML sicuro che disabiliti gli ancoraggi.
-
Confrontare l'utilizzo dell'ecosistema
JSON: REST APIs, package.json, tsconfig.json, database NoSQL, app Web. YAML: Docker Compose, manifest Kubernetes, azioni GitHub, playbook Ansible, configurazioni CI/CD, specifiche OpenAPI. JSON domina i dati di runtime; YAML domina la configurazione.
-
Decidi in base al tuo caso d'uso
APIs, scambio di dati, NoSQL, stato dell'app Web: JSON. File di configurazione, DevOps, CI/CD, infrastruttura come codice: YAML. Se gli umani lo scrivono a mano: YAML. Se le macchine lo generano e lo consumano: JSON.
Esempi
Stessa configurazione in JSON e YAML
Ingresso: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Produzione: YAML è più breve del 30% e supporta i commenti. JSON è più rigoroso e universalmente analizzabile.
Problemi comuni
- Errori di rientro YAML: YAML utilizza il rientro per la struttura e un singolo spazio sbagliato interrompe l'analisi: usa un editor con linting YAML e usa sempre gli spazi, mai le tabulazioni.
- Attacco YAML con miliardi di risate: gli ancoraggi e gli alias YAML possono creare un'espansione esponenziale, causando DoS: utilizza un parser YAML sicuro che disabilita gli ancoraggi (ad esempio yaml.safe_load in Python).
- JSON non ha commenti: la specifica JSON vieta i commenti, rendendo i file di configurazione più difficili da annotare: usa YAML per la configurazione modificata dall'uomo, JSON per i dati generati dalla macchina.
- La digitazione implicita YAML sorprende: YAML converte automaticamente sì/no in booleani e 1.0 in float, il che può interrompere i campi stringa: virgolette esplicitamente le stringhe per evitare coercizioni di tipo impreviste.
Suggerimenti
- Utilizza YAML per la configurazione creata da utenti umani (Docker Compose, Kubernetes, CI/CD) e JSON per lo scambio di dati generati dalla macchina (APIs, NoSQL, stato dell'app).
- Utilizza sempre un parser YAML sicuro che disabiliti ancoraggi e alias: non utilizzare mai un caricatore YAML generico su input non attendibili.
- Quando converti YAML in JSON, aspettati di perdere commenti, stringhe multilinea e ancoraggi: JSON è un sottoinsieme di YAML, non viceversa per le funzionalità.
- Rientra YAML con 2 spazi in modo coerente: mescolare tabulazioni e spazi o utilizzare un rientro incoerente è l'errore di analisi YAML più comune.