Come Douglas Crockford ha reso popolare JSON e perché è diventato il linguaggio predefinito per app web e API—più suggerimenti pratici per usare bene JSON oggi.

JSON (JavaScript Object Notation) è un modo leggero per rappresentare dati come testo semplice usando coppie chiave–valore e liste.
Se costruisci app web—anche se non pensi molto ai “formati dati”—JSON è probabilmente già la colla che tiene insieme il tuo prodotto. È il modo in cui un frontend chiede dati, in cui un backend risponde, come le app mobile sincronizzano stato e come i servizi esterni inviano eventi. Quando il JSON è chiaro e coerente, i team rilasciano più velocemente; quando è disordinato, ogni funzionalità richiede più tempo perché tutti discutono su cosa significhi quel dato.
Ecco un piccolo oggetto JSON che si legge in un colpo d'occhio:
{
"userId": 42,
"name": "Sam",
"isPro": true,
"tags": ["beta", "newsletter"]
}
Anche senza contesto tecnico, di solito puoi intuire cosa succede: un utente ha un ID, un nome, un flag di stato e una lista di tag.
Imparerai:
Lo scopo è semplice: aiutarti a capire non solo cos'è JSON, ma perché quasi tutte le app lo “parlano” — e come evitare gli errori comuni che i team continuano a ripetere.
Douglas Crockford non ha “inventato” ogni idea dietro JSON, ma ha fatto qualcosa altrettanto importante: ha reso visibile un pattern semplice e praticabile, gli ha dato un nome e lo ha spinto nel mainstream.
Nei primi giorni delle applicazioni web, i team si barcamenavano tra opzioni scomode per spostare dati tra browser e server. XML era comune ma verboso. Formati personalizzati basati su delimitatori erano compatti ma fragili. JavaScript poteva tecnicamente valutare dati come codice, ma questo confondeva la linea tra “dato” e “script eseguibile”, creando bug e problemi di sicurezza.
Crockford vide una strada più pulita: usare un piccolo sottoinsieme della sintassi letterale di JavaScript che potesse rappresentare dati semplici in modo affidabile—oggetti, array, stringhe, numeri, booleani e null—senza funzionalità extra.
Uno dei contributi più grandi di Crockford fu di natura sociale, non tecnica: lo chiamò JSON (JavaScript Object Notation) e pubblicò documentazione chiara su json.org. Questo diede ai team un vocabolario condiviso (“invieremo JSON”) e un riferimento abbastanza breve da leggere e sufficientemente rigoroso da implementare.
Promosse inoltre JSON come formato indipendente da JavaScript come linguaggio: molti linguaggi potevano analizzarlo e generarlo, e si mappava naturalmente alle strutture dati comuni.
L'adozione accelera quando i team si sentono sicuri di puntare su un formato a lungo termine. JSON ha gradualmente guadagnato quello status di “scommessa sicura” attraverso tappe conosciute:
L'attivismo di Crockford, combinato con questi standard e un ecosistema crescente di parser, ha aiutato JSON a passare da convenzione comoda a modo predefinito di comunicare—specialmente sulle API HTTP (argomento trattato più avanti in /blog/json-and-apis).
Prima che JSON diventasse il modo predefinito per spostare dati, il web si appoggiava a una mescolanza di formati troppo pesanti, incoerenti o troppo personalizzati per scalare tra i team.
XML era la grande scelta “standard”. Funzionava tra linguaggi, aveva strumenti e poteva rappresentare strutture nidificate. Portava però molta cerimonia.
Allo stesso tempo, molte app trasmettevano dati come query string personalizzate (soprattutto nelle richieste AJAX iniziali): coppie chiave/valore messe in URL o corpo POST. Altre inventavano formati testuali ad hoc—una lista separata da virgole qui, un blob delimitato da pipe là—spesso con regole di escaping fatte a mano che capiva solo un singolo sviluppatore.
I problemi comuni non erano teorici:
La maggior parte delle app non ha bisogno di un formato che esprima ogni possibile struttura di documento. Serve un modo prevedibile per inviare oggetti, array, stringhe, numeri e booleani—velocemente, coerentemente e con poco margine di interpretazione. Formati più semplici riducono il numero di decisioni (e errori) che i team devono prendere per endpoint.
<user>
<id>42</id>
<name>Ada</name>
<isActive>true</isActive>
</user>
{
"id": 42,
"name": "Ada",
"isActive": true
}
Entrambi esprimono la stessa idea, ma JSON è più facile da leggere, più facile da generare e più vicino a come la maggior parte delle applicazioni già modella i dati in memoria.
La permanenza di JSON non è un caso. Ha successo perché è deliberatamente piccolo: abbastanza struttura per rappresentare dati reali senza invitare a variazioni infinite.
JSON ti dà un kit minimale che si mappa pulitamente a come la maggior parte delle app pensa i dati:
name, email)true/falseQuesto è tutto. Niente date native, niente commenti, niente tipi numerici personalizzati, nessun riferimento. Questa semplicità rende JSON facile da implementare tra linguaggi e piattaforme.
JSON è abbastanza leggibile da permettere agli sviluppatori di scorrere log e risposte API, pur rimanendo semplice da analizzare rapidamente per le macchine. Evita cerimonie in eccesso ma mantiene delimitatori chiari ({}, [], :) così i parser possono essere veloci e affidabili.
Il compromesso: dato che JSON è così minimale, i team devono accordarsi su convenzioni per cose come timestamp, soldi e identificatori (per esempio, stringhe ISO-8601 per le date).
Le regole rigide di JSON (stringhe tra virgolette doppie, niente virgole finali, set ridotto di tipi) riducono l'ambiguità. Meno ambiguità significa meno errori “funziona sulla mia macchina” quando sistemi diversi scambiano dati.
JSON somiglia alla sintassi degli oggetti JavaScript, ma JSON non è JavaScript. È un formato dati agnostico rispetto al linguaggio, con regole proprie, utilizzabile da Python, Java, Go, Ruby e ovunque serva serializzazione coerente e interoperabilità.
JSON non ha vinto perché era il formato più ricco di funzionalità. Ha vinto perché si adattava al modo in cui le app web venivano già costruite: un browser pesantemente JavaScript che parla con un server usando semplici richieste HTTP.
Quando i browser si sono standardizzati attorno a JavaScript, il lato client aveva un modo incorporato per rappresentare dati strutturati: oggetti, array, stringhe, numeri, booleani e null. JSON rispecchiava questi primitivi da vicino, quindi spostare dati tra “ciò che il browser capisce” e “ciò che il server invia” risultava naturale.
Le app in stile Ajax accelerarono questo fenomeno. Invece di restituire pagine HTML complete, i server potevano restituire un piccolo payload che l'interfaccia poteva renderizzare. Una risposta come questa era subito utile:
{
"user": {"id": 42, "name": "Sam"},
"unreadCount": 3
}
Anche se la sintassi di JSON sembra JavaScript, è neutrale rispetto al linguaggio. Appena server e client in altri linguaggi dovettero interoperare con i frontend web, apparvero librerie JSON—e divennero rapidamente “equipaggiamento standard”. Analizzare una stringa JSON in strutture native è di solito una singola chiamata di funzione, e generare JSON è altrettanto semplice.
Quando framework, client API, debugger, proxy e strumenti di documentazione presuppongono JSON, scegliere altro crea attrito. Gli sviluppatori potevano ispezionare payload negli strumenti di sviluppo del browser, copiare/incollare esempi nei test e affidarsi a librerie mature per codifica, decodifica e gestione degli errori.
Una singola risposta JSON può servire un'interfaccia web, un'app mobile, un servizio interno e un'integrazione di terze parti con modifiche minime. Questa interoperabilità rese JSON una scelta sicura per team che costruiscono “un backend, molti frontend” — aiutando a diventare il contratto predefinito tra client e server.
JSON non ha vinto perché è elegante—si adattava perfettamente a come il web già funzionava. HTTP è costruito attorno all'invio di una richiesta e all'ottenimento di una risposta, e JSON è un modo semplice e prevedibile per rappresentare il “body” di quella risposta (o richiesta) come dati strutturati.
Una richiesta API di solito include un metodo e un URL (per esempio, GET /users?limit=20). Il server risponde con un codice di stato (come 200 o 404), header e un body opzionale.
Quando il body è JSON, un header chiave è:
Content-Type: application/jsonQuell'header dice ai client come interpretare i byte ricevuti. In ingresso (client → server), inviare Content-Type: application/json segnala “sto inviando JSON”, e i server possono analizzarlo in modo coerente.
JSON funziona particolarmente bene per schemi ricorrenti nelle API.
Paginazione spesso avvolge una lista con metadata:
{
"data": [{"id": 1, "name": "A"}],
"pagination": {"limit": 20, "offset": 0, "total": 153}
}
Filtri e ordinamento avvengono tipicamente nella query string dell'URL, mentre i risultati restano un array JSON (o un campo data). Per esempio: GET /orders?status=paid&sort=-created_at.
Risposte di errore giovano di una forma standard così i client possono mostrare messaggi e gestire retry:
{
"error": {
"code": "invalid_request",
"message": "limit must be between 1 and 100",
"details": {"field": "limit"}
}
}
La corrispondenza pratica è semplice: HTTP fornisce trasporto e significato (verbi, codici di stato, caching), mentre JSON fornisce una struttura leggera e leggibile per i dati stessi.
Quando si confrontano JSON e XML, spesso si confronta “dati per app” vs “documenti”. Entrambi i formati possono rappresentare informazioni strutturate, ma JSON tende a corrispondere a ciò che la maggior parte delle applicazioni effettivamente spostano: oggetti semplici, liste, stringhe, numeri, booleani e null.
XML è verboso per progetto. Tag di apertura e chiusura ripetuti rendono i payload più grandi e più difficili da scorrere nei log o negli inspector di rete. JSON di solito trasmette lo stesso significato con meno caratteri e meno rumore visivo, il che aiuta durante il debug e può ridurre i costi di banda su scala.
Non si tratta solo di estetica: payload più piccoli spesso significano trasferimenti più veloci e meno lavoro per parser e proxy.
La maggior parte dei dati delle app somiglia naturalmente a dizionari (mappe chiave/valore) e array (liste): un utente con attributi, un ordine con righe, una pagina con componenti. JSON si mappa direttamente su quel modello mentale e corrisponde alle strutture native in JavaScript e nella maggior parte dei linguaggi moderni.
XML può rappresentare le stesse strutture, ma richiede convenzioni: attributi vs elementi, elementi figlio ripetuti per le liste e regole aggiuntive per decidere cosa è un numero (dato che tutto è testo a meno di aggiungere tipizzazione sopra).
XML resta forte per casi d'uso document-centrici: contenuti misti (testo intercalato con markup), workflow editoriali e ecosistemi con tool XML maturi (per esempio, alcune integrazioni enterprise). Se il tuo payload è più vicino a un documento che a un grafo di oggetti, XML può essere una buona scelta.
Se l'obiettivo principale è scambiare dati applicativi tra frontend, backend e API, JSON è generalmente la scelta più semplice e diretta. Se hai bisogno di markup per documenti, contenuto misto o stai integrando in un dominio fortemente basato su XML, XML può essere lo strumento giusto.
JSON somiglia agli “oggetti JavaScript”, quindi i team spesso presumono di poterlo trattare come JavaScript. Qui nascono i bug: JSON è più rigoroso, più piccolo e meno tollerante.
Alcuni problemi “funziona sulla mia macchina” appaiono ripetutamente:
{name: "Ada"} non è JSON; { "name": "Ada" } lo è.{ "a": 1, } fallirà in molti parser.// e /* ... */ sono invalidi. Se ti servono note, tienile nella documentazione o usa un campo separato (con cautela) durante lo sviluppo.Questi vincoli sono intenzionali: mantengono i parser semplici e coerenti tra linguaggi.
JSON ha un solo tipo numerico: number. Non esiste un intero, decimale o tipo data nativo.
"19.99") per evitare differenze di arrotondamento tra sistemi."2025-12-26T10:15:30Z"). Evita formati di data personalizzati che richiedono indovinelli.JSON è Unicode, ma i sistemi reali sbagliano ancora su codifica ed escaping:
" e backslash \\).Analizza sempre JSON con un vero parser JSON (JSON.parse o l'equivalente del tuo linguaggio). Evita approcci di tipo eval, anche se “sembrano più veloci”. E valida gli input ai bordi—soprattutto per API pubbliche—così campi o tipi inattesi non entrino nella logica di business.
Un payload JSON non è solo “dati in transito”—è un'interfaccia a lungo termine tra team, sistemi e il te futuro. La differenza tra un payload che dura e uno che viene riscritto ogni trimestre è quasi sempre disciplina noiosa: coerenza, gestione attenta dei cambiamenti e casi limite prevedibili.
Scegli regole di nomenclatura e rispettale ovunque:
camelCase o snake_case) e non mescolare.userId in id è una breaking change anche se il significato sembra “ovvio”."count": 3 vs "count": "3") causerà bug difficili da tracciare.Puoi evitare la maggior parte delle guerre di versione rendendo i cambiamenti additivi:
/v2/...) o includi un segnale di versione nell'header—non cambiare silenziosamente le semantics.I client gestiscono i fallimenti meglio quando gli errori condividono una forma unica:
{
"error": {
"code": "INVALID_ARGUMENT",
"message": "email must be a valid address",
"details": { "field": "email" }
}
}
Ottima documentazione JSON include esempi reali—risposte di successo e di errore—con tutti i campi. Mantieni gli esempi sincronizzati con il comportamento in produzione e segnala quali campi sono opzionali, nullable o deprecati. Quando gli esempi corrispondono alle risposte reali, le integrazioni vanno più veloci e si rompono meno spesso.
Se usi un flusso di lavoro vibe-coding per avviare nuove feature velocemente, i contratti JSON diventano ancora più importanti: l'iterazione rapida è fantastica finché client e servizi non divergono.
Su Koder.ai, i team spesso generano un frontend React più un backend Go + PostgreSQL e poi iterano sulle forme API in planning mode prima di fissarle. Funzionalità come snapshots e rollback aiutano quando una piccola modifica JSON si rivela breaking, e l'export del codice sorgente rende facile mantenere il contratto nel repository e farlo rispettare con test.
JSON è facile da generare, ed è sia un punto di forza che una trappola. Se un servizio invia "age": "27" (stringa) e un altro si aspetta 27 (numero), nulla in JSON impedirà l'errore. Il risultato è di solito il peggior tipo di bug: un crash client in produzione o un glitch UI sottile che si verifica solo con certi dati.
La validazione serve a intercettare dati errati o inattesi prima che raggiungano chi ne dipende—il tuo frontend, integrazioni partner, pipeline analytics o app mobile.
Punti di fallimento comuni includono campi richiesti mancanti, chiavi rinominate, tipi sbagliati e valori “quasi giusti” (come date in formati incoerenti). Un piccolo passo di validazione al confine API può trasformare questi casi da outage a messaggi di errore chiari.
JSON Schema è un modo standard per descrivere come dovrebbe essere il tuo JSON: proprietà richieste, tipi ammessi, enum, pattern e altro. È più utile quando:
Con uno schema puoi validare richieste sul server, validare risposte nei test e generare documentazione. Molti team lo associano ai loro documenti API (spesso via OpenAPI), così il contratto diventa esplicito invece che “conoscenza tribale”. Se già pubblichi doc per sviluppatori, collegare esempi di schema in /docs aiuta a mantenere coerenza.
Non tutti i team hanno bisogno dello strumento completo dello schema dal giorno uno. Opzioni pratiche includono:
Una regola utile: inizia con esempi e test di contratto, poi aggiungi JSON Schema quando le modifiche e le integrazioni cominciano a moltiplicarsi.
JSON sembra “leggero” quando invii pochi campi. Su scala—client mobile con reti instabili, API ad alto traffico, pagine ricche di analytics—JSON può diventare un problema di performance o un rischio di affidabilità se non lo modelli e lo trasmetti con cura.
Il problema di scala più comune non è il parsing JSON, ma inviare troppo. La paginazione è la vittoria semplice: ritorna chunk prevedibili (per esempio limit + cursor) così i client non scaricano migliaia di record in una volta. Per endpoint che restituiscono oggetti nidificati, considera risposte parziali: lascia che il client richieda solo ciò che serve (campi selezionati o espansioni "include"). Questo evita l'"overfetching", dove uno schermo ha bisogno solo di name e status ma riceve ogni dettaglio storico e di configurazione.
Una regola pratica: progetta le risposte attorno alle azioni dell'utente (ciò che una schermata richiede ora), non attorno a ciò che il tuo database può joinare.
Se la tua API serve risposte JSON grandi, la compressione può ridurre notevolmente la dimensione del trasferimento. Molti server possono gzip o brotli le risposte automaticamente, e la maggior parte dei client lo gestisce senza codice extra.
Il caching è l'altra leva. A grandi linee, punta a:
Questo riduce download ripetuti e smussa i picchi di traffico.
Per output molto grandi—export, feed di eventi, sync bulk—considera risposte in streaming o parsing incrementale così i client non devono caricare l'intero documento in memoria prima di fare qualcosa di utile. Non è richiesto per la maggior parte delle app, ma è un'opzione preziosa quando “un grande blob JSON” comincia a causare timeout.
JSON è facile da loggare, il che è utile ma pericoloso. Tratta i log come un prodotto:
Fatto bene, debuggerai più in fretta riducendo il rischio di esposizione accidentale dei dati.
JSON non è “finito”—è stabile. Ciò che cambia ora è l'ecosistema attorno: editor più forti, validazione migliore, contratti API più sicuri e tooling che aiuta i team a evitare cambiamenti involontari che rompono.
JSON probabilmente resterà il formato wire predefinito per la maggior parte delle app web e mobile perché è ampiamente supportato, facile da debuggare e si mappa chiaramente alle strutture dati comuni.
Il cambiamento più grande è verso API tipate: i team continuano a inviare JSON, ma lo definiscono più precisamente usando strumenti come JSON Schema, OpenAPI e code generator. Questo significa meno momenti di “indovina la forma”, autocomplete migliore e rilevamento errori anticipato—senza abbandonare JSON.
Quando devi inviare o salvare molti record in modo efficiente (log, eventi analytics, export), un singolo array JSON gigantesco può essere scomodo. JSON Lines (chiamato anche NDJSON) risolve questo mettendo un oggetto JSON per riga. Si streamma bene, può essere processato riga per riga e si integra con gli strumenti da riga di comando.
Usala come controllo pre-partenza per payload che vivranno più a lungo di uno sprint:
2025-12-26T10:15:00Z).null e documenta la scelta.Se vuoi approfondire, sfoglia le guide correlate su /blog — specialmente argomenti come validazione con schema, versioning delle API e progettare payload per compatibilità a lungo termine.