Vai al contenuto
Toova
Tutti gli strumenti

JSON vs YAML — Quando Usare Ciascuno

Toova

JSON e YAML sono entrambi modi per rappresentare dati strutturati come testo. Entrambi supportano stringhe, numeri, booleani, array e oggetti annidati. Entrambi sono ampiamente supportati in ogni linguaggio di programmazione e piattaforma. Eppure fanno compromessi molto diversi: JSON ottimizza per la leggibilità meccanica e la velocità di parsing; YAML ottimizza per la leggibilità umana e la configurazione espressiva. Sapere quando usare ciascuno previene il tipo di attrito che deriva dall'usare un formato di configurazione progettato per le API per scrivere file di configurazione scritti a mano, o il contrario.

Questa guida copre le differenze sintattiche, i punti di forza e debolezza pratici di ciascun formato, le scelte di strumenti del mondo reale che dipendono dal formato, le considerazioni sulle prestazioni e un chiaro framework decisionale per il 2026.

JSON: Panoramica

JSON (JavaScript Object Notation) è stato formalizzato da Douglas Crockford all'inizio degli anni 2000 e standardizzato in RFC 8259 e ECMA-404. Il suo obiettivo di design era un formato minimale e non ambiguo che potesse essere analizzato e serializzato da qualsiasi linguaggio di programmazione senza richiedere un parser complesso.

JSON supporta esattamente sei tipi di dati: stringhe (sempre tra virgolette doppie), numeri, booleani (true/false), null, oggetti (mappe chiave-valore con chiavi stringa) e array (liste ordinate). Non ci sono commenti, tipi data, tipi binari o riferimenti. Questo minimalismo è intenzionale: le regole rigide eliminano l'ambiguità e rendono i parser semplici e veloci.

{
  "name": "deploy-service",
  "version": "2.1.0",
  "environment": "production",
  "replicas": 3,
  "enabled": true,
  "tags": ["backend", "critical"],
  "resources": {
    "cpu": "500m",
    "memory": "512Mi"
  }
}

Ogni chiave deve essere tra virgolette doppie. Le virgole finali non sono consentite. Non c'è modo di scrivere un commento. Le stringhe non possono estendersi su più righe senza fare l'escape del carattere newline. Questi vincoli rendono JSON più difficile da scrivere a mano ma banalmente facile da generare dal codice e da analizzare sul lato ricevente.

YAML: Panoramica

YAML (YAML Ain't Markup Language) è stato progettato da Clark Evans, Ingy dot Net e Oren Ben-Kiki a partire dal 2001. La versione 1.2, che raggiunge la compatibilità JSON, è stata finalizzata nel 2009. L'obiettivo di design di YAML è un formato di dati leggibile dall'uomo che gli sviluppatori possano scrivere direttamente negli editor di testo senza imparare una nuova sintassi. La specifica completa è su yaml.org.

YAML usa l'indentazione per esprimere la struttura invece delle parentesi. Le liste usano i trattini. Le chiavi non sono quotate per impostazione predefinita. I commenti iniziano con #. Le stringhe non richiedono virgolette a meno che non contengano caratteri speciali. Le stringhe multi-riga hanno una sintassi di blocco scalare dedicata.

# Configurazione di deployment per la produzione
name: deploy-service
version: 2.1.0
environment: production
replicas: 3
enabled: true

tags:
  - backend
  - critical

resources:
  cpu: 500m
  memory: 512Mi

La stessa struttura di dati espressa in YAML è significativamente più breve e più leggibile — specialmente quando include commenti o liste annidate. Il compromesso è che il parser YAML deve gestire significativamente più complessità: sensibilità all'indentazione, più modi per esprimere lo stesso tipo, ancore, alias, chiavi di unione e un legacy storico di interpretazione booleana ambigua.

Confronto Sintattico Fianco a Fianco

Stringhe multi-riga

Le stringhe multi-riga sono uno dei vantaggi più chiari di YAML per i file di configurazione. YAML fornisce due stili di blocco scalare: letterale (|) preserva i newline esattamente, e ripiegato (>) unisce le righe con spazi per il testo lungo.

# YAML: più modi per scrivere stringhe multi-riga
# Blocco letterale (preserva i newline)
description: |
  Questa è la riga uno.
  Questa è la riga due.
  Riga finale con newline finale.

# Blocco ripiegato (i newline diventano spazi, buono per testo lungo)
summary: >
  Questo lungo paragrafo è scritto su
  più righe ma verrà unito in
  una singola stringa separata da spazi.

# In JSON, devi fare l'escape dei newline
# "description": "Questa è la riga uno.
Questa è la riga due.
Riga finale."

Ancore e alias

Le ancore YAML (&) e gli alias (*) ti permettono di definire un valore una volta e referenziarlo in più posti, simile a una variabile. La chiave di unione (<<) unisce il contenuto di una mappatura in un'altra, fornendo una forma di ereditarietà.

# Le ancore e gli alias YAML riducono la duplicazione
defaults: &defaults
  timeout: 30
  retries: 3
  log_level: info

development:
  <<: *defaults   # unisci i defaults
  log_level: debug

staging:
  <<: *defaults
  timeout: 60

production:
  <<: *defaults

JSON non ha equivalente. In JSON, la configurazione ripetuta deve essere duplicata, gestita da un livello di template o gestita dalla logica dell'applicazione che la consuma. Le ancore YAML sono potenti per le configurazioni mantenute manualmente ma possono rendere i file più difficili da capire per i lettori non familiari con la convenzione.

Punti di Forza e Debolezza

Punti di forza di JSON

  • Parsing non ambiguo — la grammatica è abbastanza semplice da enunciare in una singola pagina. Ogni parser produce lo stesso risultato per un dato input.
  • Velocità — i parser JSON sono tra i parser di testo più veloci in esistenza. V8 analizza JSON significativamente più velocemente di quanto JavaScript stesso esegua.
  • Supporto JavaScript nativoJSON.parse() e JSON.stringify() sono built-in in ogni runtime JavaScript. Nessuna dipendenza necessaria.
  • Strumenti universali — ogni client API, database e pipeline di dati parla JSON nativamente. È il formato API de facto.
  • Nessuna sensibilità all'indentazione — gli spazi sono irrilevanti per il significato, rendendo JSON robusto alle differenze di formattazione tra editor, sistemi operativi e strumenti.

Debolezze di JSON

  • Nessun commento — non puoi spiegare un valore di configurazione inline. Questo è un punto dolente significativo per i file scritti a mano.
  • Prolisso per gli umani — tutte le chiavi devono essere quotate, le virgole separano ogni elemento e le parentesi circondano ogni oggetto e array.
  • Errori di virgola finale — le virgole finali dopo l'ultimo elemento di array o oggetto non sono valide e causano errori di parsing che è facile introdurre durante la modifica manuale.
  • Nessuna stringa multi-riga — rappresentare una stringa con newline incorporati richiede l'escape \n, rendendo cose come query SQL o script shell dolorosi da incorporare.
  • Nessun tipo data — le date sono stringhe. Le convenzioni variano (ISO 8601, timestamp Unix, formati personalizzati) e devono essere gestite dall'applicazione.

Punti di forza di YAML

  • Commenti — la sintassi dei commenti # rende YAML la scelta ovvia per i file di configurazione che necessitano di documentazione inline.
  • Leggibilità — meno rumore sintattico. Chiavi non quotate, nessuna virgola, struttura basata sull'indentazione che rispecchia come gli umani scrivono gli schemi.
  • Stringhe multi-riga — i blocchi scalari letterali e ripiegati gestiscono le stringhe lunghe in modo elegante senza escape.
  • Ancore e chiavi di unione — riducono la duplicazione nei file di configurazione grandi.
  • Sistema di tipi ricco — i parser YAML inferiscono i tipi dal formato del valore (stringhe, interi, float, booleani, null, timestamp) senza annotazioni di tipo esplicite.

Debolezze di YAML

  • Complessità — la specifica YAML completa è enorme. I casi limite abbondano: il problema della Norvegia, le sorprese della coercizione implicita del tipo, la sensibilità alle tabulazioni rispetto agli spazi.
  • Parsing lento — i parser YAML sono sostanzialmente più lenti dei parser JSON a causa della complessità della grammatica.
  • Errori di indentazione — una singola riga disallineata cambia il significato del documento senza produrre un errore di parsing, creando bug sottili difficili da individuare.
  • Il problema della Norvegia — in YAML 1.1, il testo semplice NO viene analizzato come boolean false. I codici paese, le abbreviazioni e molte parole inglesi hanno interpretazioni booleane inaspettate nei parser YAML 1.1 (ancora comuni).
  • Comportamento del parser inconsistente — i parser YAML di lingue diverse implementano sottoinsiemi diversi della specifica o versioni diverse, portando a problemi di portabilità.

Quando Usare JSON

Risposte e richieste API

JSON è il formato universale per le API REST. Ogni libreria client HTTP può serializzarlo e deserializzarlo nativamente. La velocità di parsing conta su scala API, e la grammatica non ambigua di JSON significa che ogni client e server analizza gli stessi dati in modo identico. Le risposte GraphQL sono JSON. Le definizioni OpenAPI/Swagger sono JSON (anche se YAML è accettato). Se stai progettando un'API, usa JSON come default.

{
  "user": {
    "id": 42,
    "email": "alice@example.com",
    "roles": ["admin", "editor"],
    "createdAt": "2026-01-15T10:30:00Z"
  }
}

Configurazione generata dal codice

Quando un programma genera configurazione — uno strumento di build che produce file di lock delle dipendenze, un framework che genera un manifesto di progetto, uno strumento di deployment che registra checksum — JSON è il formato giusto. L'output non deve mai essere scritto a mano, non c'è bisogno di commenti e la grammatica non ambigua di JSON garantisce che il codice che lo consuma analizzi esattamente ciò che è stato generato. package.json, tsconfig.json, package-lock.json e composer.json sono tutti esempi di questo schema.

Scambio di dati tra servizi

Quando due servizi hanno bisogno di scambiare dati — code di messaggi, webhook, stream di eventi — la velocità, l'universalità e la non ambiguità di JSON ne fanno la scelta giusta. I benefici di YAML (commenti, stringhe multi-riga) sono irrilevanti nelle pipeline di dati automatizzate. Usa il JSON Formatter per ispezionare i payload durante il debug, e il convertitore JSON to YAML se hai bisogno di rendere un payload leggibile dall'uomo per scopi di documentazione.

Archiviazione nei database

PostgreSQL, MongoDB, MySQL e la maggior parte dei database che archiviano dati strutturati lo fanno in JSON o formati compatibili con JSON. YAML non è un formato di archiviazione supportato in nessun database principale. Se stai archiviando configurazione o dati strutturati in un database, usa JSON.

Quando Usare YAML

Configurazione di infrastruttura e deployment

I manifest Kubernetes, i chart Helm, i file Docker Compose e i playbook Ansible usano tutti YAML. Questi file sono scritti e revisionati da umani, spesso contengono commenti esplicativi e beneficiano della leggibile sintassi di lista di YAML per descrivere insiemi di risorse. Un Deployment Kubernetes con più container, mount di volumi e variabili d'ambiente è sostanzialmente più facile da leggere in YAML che in JSON.

Definizioni di pipeline CI/CD

GitHub Actions, GitLab CI, CircleCI e Bitbucket Pipelines usano tutti YAML per le definizioni di pipeline. Le configurazioni delle pipeline sono scritte manualmente, spesso commentate e contengono logica multi-step che beneficia della leggibile sintassi di YAML.

# Workflow di GitHub Actions — adatto naturalmente a YAML
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Esegui i test
        run: npm test

File di configurazione dell'applicazione

Le impostazioni Django (via django-configurations), database.yml di Ruby on Rails, la configurazione Gatsby e molti altri framework usano YAML per la loro configurazione. Quando gli sviluppatori hanno bisogno di leggere e comprendere un file di configurazione insieme al codice, la capacità di YAML di includere commenti e spiegazioni multi-riga riduce il carico cognitivo.

Dati di documentazione

I generatori di siti statici come Jekyll, Hugo e Eleventy usano il frontmatter YAML nei file di contenuto. La combinazione di metadati YAML e corpo Markdown è diffusa perché la sintassi chiave-valore leggibile di YAML si adatta naturalmente all'inizio di un documento di testo.

Prestazioni

Per le pipeline di elaborazione dati, i benchmark di serializzazione mostrano costantemente JSON 5-10 volte più veloce da analizzare rispetto a YAML per dati equivalenti. Una chiamata JSON.parse() di V8 su un file da 1 MB si completa in pochi millisecondi. L'equivalente YAML richiede decine di millisecondi. Per un web server che gestisce migliaia di richieste al secondo, questa differenza conta. Per uno strumento CLI che legge un file di configurazione una volta all'avvio, non conta.

Se le prestazioni sono la tua preoccupazione principale e stai scegliendo tra JSON e YAML per un formato di dati ad alto throughput, JSON vince senza dubbio. Se hai bisogno di un parsing ancora più veloce, considera i formati binari come MessagePack o Protocol Buffers per la comunicazione inter-servizio.

Considerazioni sulla Sicurezza

I parser YAML sono più complessi e hanno una superficie di attacco maggiore dei parser JSON. Il rischio più significativo è l'esecuzione arbitraria di codice tramite deserializzazione YAML. Nel PyYAML di Python (prima che safe_load fosse applicato di default), il caricamento di YAML non attendibile con la funzione predefinita yaml.load() poteva eseguire codice Python arbitrario incorporato nel YAML.

La regola: usa sempre il caricamento sicuro quando analizzi YAML non attendibile. In Python, usa yaml.safe_load(), mai yaml.load() senza l'argomento Loader. In Ruby, usa YAML.safe_load() anziché YAML.load().

I parser JSON non hanno questa vulnerabilità perché il sistema di tipi di JSON non ha il concetto di valori eseguibili. Un parser JSON può solo produrre stringhe, numeri, booleani, null, array e oggetti — mai codice. Per l'elaborazione di dati utente non attendibili, JSON è intrinsecamente più sicuro da analizzare.

Conversione tra JSON e YAML

I formati sono semanticamente compatibili per i tipi di dati più comuni. La conversione tra di essi è semplice quando i dati non usano funzionalità specifiche di YAML (ancore, tipi personalizzati, blocchi scalari). Usa il convertitore JSON to YAML per trasformare le risposte API o i file lock in YAML leggibile per documentazione o debug. Usa il convertitore YAML to JSON per alimentare la configurazione YAML in strumenti o API JSON-nativi. Entrambi gli strumenti girano nel browser — i tuoi dati non lasciano mai il tuo dispositivo.

Il JSON Formatter è utile per ispezionare e validare la struttura JSON prima della conversione.

Framework Decisionale

  • Stai scrivendo una risposta o richiesta REST API? JSON.
  • Stai configurando Kubernetes, Docker Compose o Ansible? YAML.
  • Stai scrivendo una pipeline CI/CD? YAML.
  • Stai archiviando dati in un database? JSON.
  • Stai scrivendo un file di configurazione modificabile dall'uomo con commenti? YAML.
  • Stai generando configurazione in modo programmico dal codice? JSON.
  • Stai elaborando input utente non attendibile? JSON (parser più sicuro).
  • Pipeline di dati ad alto throughput? JSON (o formato binario).
  • Progetto che usa già un formato in modo coerente? Usa la convenzione esistente.

In caso di dubbio, il fattore più importante sono gli umani che leggeranno e scriveranno il file. Se il file è principalmente generato da macchine e consumato da macchine, la semplicità di JSON vince. Se gli umani lo leggeranno, lo modificheranno e si preoccuperanno della sua chiarezza, l'espressività di YAML vale la complessità aggiuntiva del parser.