JSON

13 tools

Che cos'è JSON?

JSON (JavaScript Object Notation) è un formato leggero di scambio dati basato su testo, facile da leggere e scrivere per gli esseri umani e semplice da analizzare e generare per le macchine. Originariamente derivato da JavaScript, JSON è indipendente dal linguaggio ed è ora lo standard de facto per lo scambio di dati sul Web.

JSON rappresenta i dati come coppie chiave-valore organizzate in oggetti e array. La sua semplicità lo ha reso il formato dominante per le API REST, i file di configurazione e l'archiviazione dei dati.

Breve storia

JSON è stato formalizzato da Douglas Crockford all'inizio degli anni 2000. La specifica è stata pubblicata su json.org nel 2001. RFC 4627 è seguito nel 2006, e l'attuale standard ECMA-404 nel 2013.

Prima di JSON, XML era il formato di scambio dati dominante sul Web. Il minimalismo di JSON — nessun attributo, istruzioni di elaborazione o namespace — lo ha reso immediatamente popolare. Entro il 2010, JSON aveva ampiamente sostituito XML per le API Web.

Tipi di dati JSON

JSON supporta esattamente sei tipi di dati. Ogni valore in un documento JSON valido deve essere uno di questi:

String"hello world"

Qualsiasi sequenza di caratteri Unicode tra virgolette doppie. Sequenze di escape con barra rovesciata (\n, \t, \") sono supportate.

Number42 / 3.14 / 1e10

Intero o numero in virgola mobile. La notazione scientifica (1e10) è consentita. Nessuna distinzione tra int e float a livello JSON.

Booleantrue / false

I token letterali true o false (solo minuscolo). Non esiste truthy/falsy — solo booleano stretto.

Nullnull

Il token letterale null (minuscolo). Rappresenta l'assenza di valore. Diverso da undefined, che non è un tipo JSON.

Array[1, "two", null]

Un elenco ordinato di valori tra parentesi quadre. Gli elementi possono essere di tipi misti e gli array possono essere annidati arbitrariamente.

Object{"key": "value"}

Una raccolta non ordinata di coppie chiave-valore tra parentesi graffe. Le chiavi devono essere stringhe.

{
  "string":  "hello world",
  "number":  42,
  "float":   3.14,
  "boolean": true,
  "null":    null,
  "array":   [1, 2, 3],
  "object":  { "nested": "value" }
}

Regole di sintassi JSON

JSON ha regole di sintassi rigide. Una piccola deviazione causa un errore di analisi. Queste sono le sei regole più importanti:

Solo stringhe tra virgolette doppie

Tutti i valori di stringa e le chiavi degli oggetti devono usare virgolette doppie. Le virgolette singole non sono JSON valido.

Nessuna virgola finale

JSON non consente virgole finali dopo l'ultimo elemento di un array o l'ultima proprietà di un oggetto.

Nessun commento

JSON non ha sintassi per i commenti. // e /* */ non sono validi. Per i file di configurazione che richiedono commenti, considera JSON5 o YAML.

Nessun undefined o funzione

JSON supporta solo sei tipi primitivi. Valori JavaScript come undefined, NaN, Infinity e le funzioni non possono essere rappresentati.

Le chiavi degli oggetti devono essere stringhe

Tutte le chiavi degli oggetti devono essere stringhe tra virgolette. Chiavi numeriche o identificatori senza virgolette non sono consentiti.

Distinzione maiuscole/minuscole

JSON è sensibile alle maiuscole. true, false e null devono essere tutti in minuscolo.

JSON non valido vs. valido

Non valido
{
  'name': 'Alice',       // single quotes — invalid
  age: 30,              // unquoted key — invalid
  "scores": [1, 2, 3,], // trailing comma — invalid
  "note": undefined     // undefined — invalid
}
Valido
{
  "name": "Alice",
  "age": 30,
  "scores": [1, 2, 3],
  "note": null
}

JSON nel Web moderno

API REST

JSON è il formato di corpo standard per le richieste e le risposte delle API REST. Praticamente tutti i linguaggi di programmazione hanno un parser JSON integrato.

File di configurazione

package.json, tsconfig.json, .eslintrc e molti altri strumenti per sviluppatori usano JSON per la configurazione.

Database NoSQL

I database documentali come MongoDB, CouchDB e Amazon DynamoDB archiviano i dati come documenti JSON.

Stato e dati del frontend

localStorage e sessionStorage memorizzano stringhe, quindi JSON.stringify/JSON.parse vengono costantemente usati per serializzare oggetti JavaScript.

JSON vs. altri formati

JSON non è sempre la scelta migliore. Ecco come si confronta con altri formati di dati comuni:

JSON vs XML
Vantaggi di JSON rispetto a XML

Sintassi più semplice, dimensioni file ridotte, più facile da analizzare, più leggibile

Svantaggi di JSON rispetto a XML

Nessun supporto per attributi, istruzioni di elaborazione o namespace XML

Scegli XML quando

Hai bisogno di metadati di documento, modelli di contenuto misto o schemi XML

JSON vs YAML
Vantaggi di JSON rispetto a YAML

Sintassi più rigida (meno ambiguità), migliore supporto degli strumenti, più portabile

Svantaggi di JSON rispetto a YAML

Nessun supporto ai commenti, leggermente più verboso per dati profondamente annidati

Scegli YAML quando

File di configurazione modificati manualmente, Docker Compose, GitHub Actions, Kubernetes

JSON vs TOML
Vantaggi di JSON rispetto a TOML

Supporto ecosistema più ampio, analisi più veloce, gestione dei tipi più prevedibile

Svantaggi di JSON rispetto a TOML

Nessun tipo di data nativo, meno intuitivo per strutture annidate complesse

Scegli TOML quando

Rust (Cargo.toml), Python (pyproject.toml), configurazione applicazioni in stile INI

JSON vs CSV
Vantaggi di JSON rispetto a CSV

Dati strutturati e annidati, non limitato a righe e colonne piatte

Svantaggi di JSON rispetto a CSV

Dimensioni file molto maggiori, prestazioni peggiori per dati puramente tabulari

Scegli CSV quando

Dati di fogli di calcolo, esportazioni di database, dati da aprire in Excel o pandas

JSON Schema

JSON Schema è un vocabolario per validare la struttura dei documenti JSON. Uno schema descrive i tipi previsti, i campi obbligatori e i vincoli di un valore JSON.

Strumenti come ajv (JavaScript), jsonschema (Python) e validatori integrati in molti IDE supportano JSON Schema. OpenAPI usa JSON Schema per descrivere i corpi delle richieste e risposte API.

Insidie comuni di JSON

Perdita di precisione numerica

I numeri JSON vengono analizzati come float a doppia precisione IEEE 754. Gli interi maggiori di 2^53 perdono precisione. Passa gli ID grandi come stringhe.

Nessun tipo data

JSON non ha un tipo data. Le date vengono tipicamente serializzate come stringhe ISO 8601 o timestamp Unix.

I riferimenti circolari mandano in crash i serializzatori

JSON.stringify genera un TypeError sui riferimenti circolari degli oggetti.

Problemi Unicode e BOM

JSON deve essere codificato come UTF-8, UTF-16 o UTF-32. Un BOM all'inizio di un file JSON non è conforme alle specifiche.

Inquinamento del prototipo

Quando si analizza JSON non affidabile, la fusione di oggetti analizzati può essere vulnerabile agli attacchi di inquinamento del prototipo tramite la chiave __proto__.

Null vs. chiave mancante

{"key": null} e una "key" mancante sono semanticamente diversi. Null significa che il campo esiste con un valore assente; mancante significa che il campo non è stato specificato.

Domande frequenti

Cosa significa JSON?

JSON sta per JavaScript Object Notation. Nonostante il nome, JSON è completamente indipendente dal linguaggio.

JSON è uguale a un oggetto JavaScript?

No. JSON è un formato di testo che assomiglia a un letterale di oggetto JavaScript, ma con regole più rigide.

JSON può avere commenti?

No. La specifica JSON non include la sintassi dei commenti. Per i file di configurazione che richiedono commenti, considera JSONC, JSON5 o YAML.

Qual è la differenza tra JSON e JSONP?

JSONP era una soluzione alternativa alla politica same-origin del browser. È obsoleto — usa CORS invece.

Come formatto JSON in modo leggibile?

In JavaScript: JSON.stringify(data, null, 2). In Python: json.dumps(data, indent=2). Nel terminale: cat file.json | jq .

Cos'è NDJSON o JSON Lines?

NDJSON memorizza un oggetto JSON per riga. È popolare per i file di log e le esportazioni di dati di grandi dimensioni.

Gli spazi bianchi sono importanti in JSON?

Gli spazi bianchi tra i token sono insignificanti. La formattazione è una questione di stile, non di semantica.

Qual è la dimensione massima di un file JSON?

La specifica JSON non impone un limite di dimensioni. In pratica sei limitato dalla memoria del parser e dal trasferimento di rete.

JSON può rappresentare dati binari?

Non direttamente. I dati binari devono essere codificati in Base64 prima di essere incorporati in JSON, aumentando le dimensioni di ~33%.

Cos'è JSON5?

JSON5 è un superset di JSON che aggiunge: chiavi senza virgolette, stringhe con virgolette singole, virgole finali, commenti e stringhe multi-riga.