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:
"hello world"Qualsiasi sequenza di caratteri Unicode tra virgolette doppie. Sequenze di escape con barra rovesciata (\n, \t, \") sono supportate.
42 / 3.14 / 1e10Intero o numero in virgola mobile. La notazione scientifica (1e10) è consentita. Nessuna distinzione tra int e float a livello JSON.
true / falseI token letterali true o false (solo minuscolo). Non esiste truthy/falsy — solo booleano stretto.
nullIl token letterale null (minuscolo). Rappresenta l'assenza di valore. Diverso da undefined, che non è un tipo JSON.
[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.
{"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:
Tutti i valori di stringa e le chiavi degli oggetti devono usare virgolette doppie. Le virgolette singole non sono JSON valido.
JSON non consente virgole finali dopo l'ultimo elemento di un array o l'ultima proprietà di un oggetto.
JSON non ha sintassi per i commenti. // e /* */ non sono validi. Per i file di configurazione che richiedono commenti, considera JSON5 o YAML.
JSON supporta solo sei tipi primitivi. Valori JavaScript come undefined, NaN, Infinity e le funzioni non possono essere rappresentati.
Tutte le chiavi degli oggetti devono essere stringhe tra virgolette. Chiavi numeriche o identificatori senza virgolette non sono consentiti.
JSON è sensibile alle maiuscole. true, false e null devono essere tutti in minuscolo.
JSON non valido vs. valido
{
'name': 'Alice', // single quotes — invalid
age: 30, // unquoted key — invalid
"scores": [1, 2, 3,], // trailing comma — invalid
"note": undefined // undefined — invalid
}{
"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:
Sintassi più semplice, dimensioni file ridotte, più facile da analizzare, più leggibile
Nessun supporto per attributi, istruzioni di elaborazione o namespace XML
Hai bisogno di metadati di documento, modelli di contenuto misto o schemi XML
Sintassi più rigida (meno ambiguità), migliore supporto degli strumenti, più portabile
Nessun supporto ai commenti, leggermente più verboso per dati profondamente annidati
File di configurazione modificati manualmente, Docker Compose, GitHub Actions, Kubernetes
Supporto ecosistema più ampio, analisi più veloce, gestione dei tipi più prevedibile
Nessun tipo di data nativo, meno intuitivo per strutture annidate complesse
Rust (Cargo.toml), Python (pyproject.toml), configurazione applicazioni in stile INI
Dati strutturati e annidati, non limitato a righe e colonne piatte
Dimensioni file molto maggiori, prestazioni peggiori per dati puramente tabulari
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
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.
JSON non ha un tipo data. Le date vengono tipicamente serializzate come stringhe ISO 8601 o timestamp Unix.
JSON.stringify genera un TypeError sui riferimenti circolari degli oggetti.
JSON deve essere codificato come UTF-8, UTF-16 o UTF-32. Un BOM all'inizio di un file JSON non è conforme alle specifiche.
Quando si analizza JSON non affidabile, la fusione di oggetti analizzati può essere vulnerabile agli attacchi di inquinamento del prototipo tramite la chiave __proto__.
{"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
JSON sta per JavaScript Object Notation. Nonostante il nome, JSON è completamente indipendente dal linguaggio.
No. JSON è un formato di testo che assomiglia a un letterale di oggetto JavaScript, ma con regole più rigide.
No. La specifica JSON non include la sintassi dei commenti. Per i file di configurazione che richiedono commenti, considera JSONC, JSON5 o YAML.
JSONP era una soluzione alternativa alla politica same-origin del browser. È obsoleto — usa CORS invece.
In JavaScript: JSON.stringify(data, null, 2). In Python: json.dumps(data, indent=2). Nel terminale: cat file.json | jq .
NDJSON memorizza un oggetto JSON per riga. È popolare per i file di log e le esportazioni di dati di grandi dimensioni.
Gli spazi bianchi tra i token sono insignificanti. La formattazione è una questione di stile, non di semantica.
La specifica JSON non impone un limite di dimensioni. In pratica sei limitato dalla memoria del parser e dal trasferimento di rete.
Non direttamente. I dati binari devono essere codificati in Base64 prima di essere incorporati in JSON, aumentando le dimensioni di ~33%.
JSON5 è un superset di JSON che aggiunge: chiavi senza virgolette, stringhe con virgolette singole, virgole finali, commenti e stringhe multi-riga.