Vai al contenuto principale
CuteJSON
↑↓ Naviga Enter Seleziona Esc Chiudi

Tipi di dati JSON spiegati, con i casi limite che rompono i parser

Pubblicato 4 min di lettura Di Akash Kinkar Pandey

JSON ha esattamente sei tipi di valore: stringa, numero, booleano, nullo, array e oggetto. Nulla nella specifica ne aggiunge un settimo. Questa lista breve e facile da enunciare e sorprendentemente facile da sbagliare nella pratica, soprattutto ai confini che ogni tipo ha e che i tipi nativi di un linguaggio non condividono.

Stringa

Testo tra doppi apici, mai apici singoli. 'hello' non e JSON valido, solo "hello" lo e. Alcuni caratteri necessitano di escape all’interno di una stringa: l’apice stesso (\"), una barra rovesciata (\\), e i caratteri di controllo \n, \r, \t, \b e \f. Qualsiasi altra cosa, incluso la maggior parte del testo Unicode, puo essere inserita senza escape purché il file sia UTF-8 valido. JSON Escape and Unescape gestisce la conversione in entrambe le direzioni e riporta esattamente quale carattere ha rotto una sequenza di escape mal formata, anziche un errore di parsing generico.

Numero

Un unico tipo numerico, non tipi intero e float separati come in alcuni linguaggi. Un numero JSON e una sequenza di cifre, un punto decimale opzionale, e un esponente opzionale: 42, -3.14, 2.5e10. Nessun esadecimale, nessun Infinity, nessun NaN, e nessuno zero iniziale davanti a una cifra diversa da zero (0123 e invalido, 0.123 e corretto). Il confine piu delicato qui: il tipo Number di JavaScript e un float a 64 bit, che non puo rappresentare esattamente ogni intero oltre circa 2^53 (circa nove mila miliardi). Analizzare un documento JSON contenente un ID di database a 64 bit o un Snowflake ID con JSON.parse nella console di un browser puo far tornare le cifre finali arrotondate, silenziosamente. Il JSON Formatter di questo sito e costruito su un flusso di token anziche su JSON.parse specificamente perche un intero di venti cifre sopravviva un giro di andata e ritorno senza arrotondamento, e riporta i numeri che non ha potuto rappresentare in sicurezza anziche arrotondire senza dirlo.

Booleano

Esattamente due valori letterali, in minuscolo, senza apici: true e false. "true" e una stringa, non un booleano, e una fonte comune di bug quando un campo che dovrebbe essere booleano viene serializzato come testo da qualche parte a monte.

Nullo

Un valore letterale, in minuscolo, senza apici: null. Rappresenta l’assenza deliberata di un valore, che e una cosa diversa da una chiave che manca completamente. {"middleName": null} dice “questa persona non ha un secondo nome, e abbiamo verificato.” Un documento senza la chiave middleName affatto non dice nulla su se ne esista una. Le API che confondono le due (usando una chiave mancante e un valore nullo in modo intercambiabile) rendono quella distinzione impossibile da recuperare dalla parte ricevente.

Array

Un elenco ordinato, [ ], separato da virgole, con elementi di qualsiasi tipo incluso tipi misti nello stesso array: [1, "two", true, null] e JSON valido anche se sarebbe una scelta di schema strana. L’ordine e garantito e significativo; due array con gli stessi elementi in ordine diverso sono valori diversi.

Oggetto

Un insieme non ordinato di coppie chiave-valore, { }, dove le chiavi sono sempre stringhe (anche una chiave dall’aspetto numerico come "2" e una stringa, non un numero), i valori possono essere di qualsiasi tipo. Due chiavi con lo stesso nome all’interno di un oggetto non sono vietate dalla grammatica, anche se la specifica definisce il comportamento “non raccomandato” e lascia che succeda dopo al parser; la maggior parte delle implementazioni, incluso JSON.parse, silenziosamente mantengono l’ultima e scartano le precedenti. Il JSON Validator segnala una chiave duplicata come un avviso anziche lasciar passare silenziosamente un documento che ne contiene una, dato che quale valore sopravvive e il tipo di cosa che dovrebbe essere una decisione esplicita.

Cosa nessuno dei sei puo contenere

Nessun tipo data: un timestamp e una stringa, quasi sempre in formato ISO 8601 ("2026-08-24T10:00:00Z"), per convenzione piuttosto che per qualcosa che JSON imponga. Nessun undefined: una chiave che sarebbe undefined in JavaScript viene omessa dall’oggetto anziche scritta con quel valore, dato che JSON non ha nessun letterale per questo. Nessuna funzione, nessun Map o Set, nessun commento da nessuna parte nel documento. Un formato che ha bisogno di qualcuna di queste (commenti inline nelle configurazioni, per esempio) sta scegliendo deliberatamente un formato diverso, non un’estensione di JSON; consulta JSON vs YAML per il compromesso che il supporto ai commenti e alcune altre comodita comportano.

Provarlo

Incolla qualsiasi documento nel JSON Viewer e ogni valore riceve il suo colore e il suo badge nell’albero, che e un modo rapido per vedere esattamente come un documento e tipizzato senza leggere il testo grezzo carattere per carattere. Per le regole di sintassi in un’occhiata, consulta il JSON Cheat Sheet.

Torna a tutti i post