Formattare JSON sembra la cosa piu semplice che uno strumento possa fare:
aggiungere spazi e a capo affinche un umano possa leggerlo. La maggior
parte dei formattatori fa esattamente questo chiamando JSON.parse e poi
JSON.stringify con un argomento di indentazione. Questo viaggio di andata
e ritorno funziona per il JSON che scrivi a mano e si rompe silenziosamente
per il JSON che ottieni da qualche altra parte.
I due bug che il viaggio di andata e ritorno causa
JSON.parse converte ogni numero in un double JavaScript. Un double non
puo contenere ogni intero esattamente dopo Number.MAX_SAFE_INTEGER, che
e 9007199254740991. Un ID snowflake, una chiave primaria del database, o
un timestamp in nanosecondi puo facilmente superare questo limite, e una
volta che lo fa, ri-serializzare il valore analizzato modifica le cifre.
12345678901234567890 ritorna come 12345678901234567000. Nessuno se ne
accorge fino a quando l’ID non e sbagliato da qualche parte a valle.
Questo stesso viaggio riordina anche le chiavi dell’oggetto che sembrano
numeri, dato che JSON.stringify percorre le chiavi enumerabili proprie
di un oggetto JavaScript in un ordine specifico: le chiavi tipo intero
prima, in ordine ascendente, poi tutto il resto in ordine di inserimento.
Un documento scritto come {"2": "b", "1": "a"} ritorna come
{"1": "a", "2": "b"}, che e un documento diverso anche se ogni valore
e sopravvissuto.
Cosa fa il formattatore JSON al posto
Questo strumento non chiama mai JSON.parse. Tokenizza il tuo documento,
valida il flusso di token rispetto a RFC 8259, e ristampa da quei token.
Un numero e copiato come i caratteri esatti che hai scritto, non
ri-codificato tramite un double. Una chiava resta dove l’hai posta.
Incollando
{"2":"second","1":"first","id":12345678901234567890,"note":"line1\nline2"}
e premendo Formatta restituisce:
{
"2": "second",
"1": "first",
"id": 12345678901234567890,
"note": "line1\nline2"
}
"2" resta prima di "1", e l’id di venti cifre ritorna esattamente
come scritto. Solo lo spazio e cambiato.
Leggere un errore
Se il documento non e JSON valido, lo strumento marca la linea offensiva nel gutter e nomina l’errore reale invece di citare il token su cui si e bloccato. Una virgola finale prima di una parentesi graffa chiusa e segnalata come una virgola finale, nella linea dove la virgola si trova, non alla fine del file dove un parser semplice si arrende.
Formatta vs Minifica
Entrambi i pulsanti fanno la stessa ristampa dai token; solo lo spazio differisce. Formatta aggiunge a capo e la larghezza di indentazione che hai scelto (2 spazi, 4 spazi, o un tab). Minifica rimuove ogni spazio, tab e a capo che JSON non richiede. Nessuno modifica un valore, quindi e sicuro premere qualsiasi di essi quante volte vuoi, o passare da uno all’altro senza incollare di nuovo.
Provalo su un documento con un ID lungo o un file di configurazione con
chiavi numeriche, e confronta il risultato con un formattatore che passa
per JSON.parse. La differenza appare immediatamente.