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

Come formattare JSON senza perdere precisione

Pubblicato 2 min di lettura Di Akash Kinkar Pandey

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.

Torna a tutti i post