JSON vs YAML: differenze e casi d'uso

JSON e YAML sono i due formati di serializzazione testuali più utilizzati per descrivere dati strutturati: configurazione di applicazioni, payload di API, file di infrastruttura, manifest Kubernetes, pipeline CI/CD. Entrambi rappresentano le stesse strutture fondamentali (oggetti, liste, scalari) ma con filosofie diverse: JSON privilegia la leggibilità macchina e l'universalità, YAML punta sulla leggibilità umana e sulla concisione. Questo articolo confronta i due formati punto per punto per aiutarti a scegliere.

Cos'è JSON?

JSON (JavaScript Object Notation) è un formato di serializzazione introdotto da Douglas Crockford all'inizio degli anni 2000, derivato dalla sintassi letterale di oggetto JavaScript. Standardizzato dalla RFC 8259 e da ECMA-404, è oggi il formato cardine del web: la quasi totalità delle API REST, dei database NoSQL e delle configurazioni frontend lo usa.

JSON si basa su due strutture:

  • Una collezione ordinata di coppie chiave-valore (l'oggetto, tra parentesi graffe)
  • Una lista ordinata di valori (l'array, tra parentesi quadre)

I valori scalari sono string, number, true, false o null. Le stringhe sono obbligatoriamente racchiuse tra virgolette doppie. JSON non supporta i commenti.

Cos'è YAML?

YAML (YAML Ain't Markup Language) è un formato apparso nel 2001, progettato fin dall'inizio per essere leggibile da un umano. La specifica attuale è YAML 1.2.2. La sua caratteristica distintiva: usa l'indentazione per esprimere la gerarchia, alla maniera di Python.

YAML è un sovrainsieme di JSON dalla versione 1.2: qualsiasi documento JSON valido è un documento YAML valido. Ma YAML aggiunge molto: commenti, stringhe senza virgolette, multi-linea, anchor e alias, tag per la tipizzazione esplicita, documenti multipli in uno stesso file (---).

Sintassi a confronto

Ecco la stessa struttura espressa nei due formati.

JSON

{
  "name": "cdrn",
  "version": "1.14",
  "tags": ["seo", "tools", "open-source"],
  "author": {
    "name": "Adrien",
    "email": "contact@example.com"
  },
  "active": true,
  "stars": null
}

YAML

# Configurazione progetto
name: cdrn
version: "1.14"
tags:
  - seo
  - tools
  - open-source
author:
  name: Adrien
  email: contact@example.com
active: true
stars: null

Sullo stesso contenuto, YAML occupa più o meno lo stesso numero di righe ma evita parentesi graffe, parentesi quadre, virgole finali e virgolette sulla maggior parte delle stringhe. I commenti (righe #) sono ammessi.

Tipi supportati

JSON conosce 6 tipi: object, array, string, number, boolean, null. Nessuna data nativa, nessun binario, nessuna distinzione esplicita tra intero e float.

YAML 1.2 conosce gli stessi di JSON e aggiunge: timestamp ISO 8601, binari (codificati base64 tramite il tag !!binary), interi e float distinti, l'infinito, NaN, e tipi personalizzati tramite tag (!!str, !!int, !!float...). YAML 1.1 accettava yes/no/on/off come booleani: una trappola classica sui vecchi parser.

Prestazioni ed ecosistema

JSON è tipicamente da 3 a 10 volte più veloce da parsare rispetto a YAML, e i suoi parser sono disponibili ovunque (integrati nel runtime della quasi totalità dei linguaggi). Le librerie YAML sono più pesanti perché gestiscono una grammatica più ricca (anchor, tag, multi-doc).

Lato ecosistema: JSON domina le API HTTP, i database NoSQL (MongoDB, CouchDB), i file package.json, composer.json, tsconfig.json. YAML si è imposto per la configurazione applicativa e l'infrastructure-as-code: Symfony, Spring Boot, Rails, Docker Compose, Kubernetes, GitHub Actions, GitLab CI, Ansible.

Tabella comparativa

Criterio JSON YAML
Leggibilità umanaBuonaEccellente
Leggibilità macchinaEccellenteCorretta
CommentiNoSì (#)
Indentazione significativaNo
Velocità di parsingVelocePiù lenta
Tipi ricchi (data, binario)No
Anchor / aliasNo
Caso d'uso tipicoAPI, archiviazione, scambio datiConfigurazione, infra-as-code

Casi d'uso tipici

Scegliere JSON quando

  • Stai progettando un'API REST o un endpoint webhook
  • Stai memorizzando dati in un database NoSQL o in una cache
  • Stai scambiando dati tra frontend e backend
  • La performance di parsing è critica (alto throughput, edge)
  • Vuoi un formato universalmente supportato senza dipendenze

Scegliere YAML quando

  • Stai scrivendo una configurazione applicativa modificata a mano
  • Hai bisogno di commenti per documentare le opzioni
  • Stai scrivendo Kubernetes, Docker Compose, GitHub Actions, Ansible
  • Vuoi fattorizzare blocchi con anchor e alias
  • La leggibilità ha la priorità sulla rapidità di elaborazione

Raccomandazione

La regola semplice: JSON per la macchina, YAML per l'umano. Se il tuo file è prodotto o consumato da un programma, prendi JSON. Se è scritto e riletto a mano, prendi YAML. Molti ecosistemi accettano entrambi: Symfony legge YAML, JSON e XML per le sue configurazioni, Kubernetes accetta entrambi per i suoi manifest. Nel dubbio, parti su YAML per la configurazione umana e JSON per i flussi automatizzati.

Puoi testare la conversione da un formato all'altro con il nostro convertitore JSON / YAML e formattare rapidamente un documento con il formattatore JSON.

Domande frequenti

YAML è più lento di JSON?

Sì, in regola generale, parsare un documento YAML costa diverse volte più CPU rispetto a parsare lo stesso documento JSON, perché la grammatica YAML è più ricca (indentazione, tag, anchor). In pratica, il divario è trascurabile per file di configurazione. Diventa sensibile quando si parsano decine di migliaia di documenti in ciclo.

Si può convertire automaticamente YAML in JSON?

Sì: qualsiasi documento YAML può essere convertito in JSON senza perdita se si evitano i tipi YAML specifici (timestamp, anchor). Il contrario è ancora più semplice, dato che JSON è un sottoinsieme di YAML 1.2. Il nostro convertitore fa entrambi i sensi.

JSON accetta i commenti?

No, lo standard JSON li vieta. Esistono dialetti (JSON5, JSONC) ma non sono universalmente supportati. Se hai bisogno di commenti, prendi YAML o TOML.

Perché Kubernetes usa YAML e non JSON?

I manifest Kubernetes sono scritti e riletti da umani. YAML offre i commenti, una sintassi meno rumorosa e la possibilità di fattorizzare tramite anchor. L'API Kubernetes accetta anche JSON, ma l'uso idiomatico resta YAML.

YAML è davvero un sovrainsieme di JSON?

Sì da YAML 1.2: qualsiasi documento JSON valido è un documento YAML valido. Questo permette di incorporare JSON in un file YAML senza modificarlo, il che è pratico per i blocchi generati o copiati-incollati.