Vai al contenuto
jsonbeautifiers
Italiano

Validatore JSON

Ogni errore con riga, colonna, causa e soluzione esatte.

Input

Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso

La validazione risponde a una sola domanda: questo è un documento JSON legale? La parte utile è che cosa succede quando la risposta è no. La maggior parte dei validatori ti dice che un token era inatteso e ti lascia cercarlo. Questo ti dice quale carattere, a quale riga e colonna, che cosa si aspettava al suo posto e come rimediare.

Non si ferma nemmeno al primo problema. Un documento con quattro errori ne segnala quattro, così li correggi in una passata invece che in quattro.

Che cosa viene controllato

La grammatica della RFC 8259, per intero. Comprese le parti che sorprendono.

Spazi bianchi
Tra i token sono legali esattamente quattro caratteri: spazio, tabulazione, ritorno a capo e avanzamento riga. Uno spazio unificatore, uno spazio a larghezza zero o uno spazio ideografico è un errore di sintassi, e questo validatore nomina il carattere invece di segnalare un token inatteso. Arrivano di continuo copiando JSON da una pagina web, da un PDF o da una chat.
Numeri
Niente zeri iniziali, niente più iniziale, niente esadecimale, niente punto decimale finale, niente NaN e niente Infinity. Ogni violazione ha il suo messaggio, perché ognuna ha una causa diversa e una soluzione diversa.
Stringhe
Sono legali solo nove sequenze di escape. I caratteri di controllo sotto U+0020 devono avere l’escape. I surrogati spaiati vengono segnalati come avviso, perché si analizzano ma non sopravvivono a una ricodifica in UTF-8.
Un solo valore di primo livello
Un documento ne contiene esattamente uno. Più valori, uno per riga, è NDJSON, e questo validatore riconosce quella forma e lo dice invece di segnalare un generico errore di contenuto in eccesso.

Avvisi, che non sono errori

Alcune cose si analizzano e ti rovinano comunque il pomeriggio. Vengono segnalate a parte, così non bloccano mai l’output.

Chiavi duplicate
La RFC 8259 dice che le chiavi DOVREBBERO essere uniche e lascia il comportamento indefinito quando non lo sono. JavaScript e Python tengono l’ultima, alcuni parser Go e Java rifiutano il documento, qualcuno tiene la prima. Qui ottieni la posizione di entrambe.
Interi fuori dall’intervallo sicuro
Sopra 2^53-1 un numero JavaScript non può contenere il valore esatto. L’avviso indica il valore che JSON.parse ti darebbe al suo posto.
Byte order mark
Un U+FEFF iniziale qui viene accettato e segnalato, perché JSON.parse nei browser e in Node lo rifiuta senza appello.
Annidamento molto profondo
Questo parser è iterativo e non ha limiti di profondità, ma molti consumatori sì. Misurato su questa macchina, V8 si rifiuta di serializzare una struttura più profonda di circa 4.800 livelli: un documento che riesci a leggere può quindi restare un documento che non riesci a riscrivere.

Validare la forma oltre alla sintassi

La validazione sintattica dice soltanto che il documento è ben formato, non che contiene ciò che ti aspettavi. Per quello serve JSON Schema, che descrive proprietà obbligatorie, tipi e vincoli. Il nostro generatore di schema produce un punto di partenza da un payload di esempio.

How to do this in code

Controllare la validità nel codice, e ricavarne un errore che serva a qualcosa.

js JavaScript

Nella libreria standard non esiste un validatore che non sollevi eccezioni, quindi il try/catch è l’API.

function validate(text) {
  try {
    JSON.parse(text);
    return { ok: true };
  } catch (e) {
    // Modern V8 includes a (line L column C) suffix in the message.
    return { ok: false, message: e.message };
  }
}
py Python

JSONDecodeError porta msg, lineno, colno, pos e doc, cioè più struttura di quanta ne diano quasi tutti i runtime.

import json

try:
    json.loads(text)
except json.JSONDecodeError as e:
    print(f"{e.msg} at line {e.lineno} column {e.colno} (char {e.pos})")
sh Shell

jq empty analizza l’input e non stampa nulla, il che ne fa un controllo di validità pulito dentro uno script di CI.

# jq exits non-zero and prints the position on failure
jq empty input.json

# Python, no extra install
python -m json.tool input.json > /dev/null
go Go

Go segnala un offset in byte anziché una riga, quindi gli a capo devi contarli tu.

if !json.Valid(data) {
    // Valid() gives no position. To get one, decode and
    // inspect the SyntaxError:
    var v any
    if err := json.Unmarshal(data, &v); err != nil {
        var se *json.SyntaxError
        if errors.As(err, &se) {
            line := 1 + bytes.Count(data[:se.Offset], []byte("\n"))
            return fmt.Errorf("%v at line %d", se, line)
        }
    }
}

Domande frequenti

Perché segnala più errori quando altri validatori ne segnalano uno?
Perché il parser si riprende invece di fermarsi. Dopo aver segnalato un problema si risincronizza e prosegue, così un documento con una virgola finale, una stringa tra apici singoli e una chiave senza virgolette li segnala tutti e tre in una sola passata.
Una stringa o un numero da soli sono JSON valido?
Sì, dalla RFC 7159 del 2014. La RFC 4627 originale richiedeva che il valore di primo livello fosse un oggetto o un array; la specifica attuale, la RFC 8259, consente qualsiasi valore. Quindi "ciao", 42 e null sono documenti JSON completi e validi.
Le virgole finali sono mai ammesse?
In JSON no. Lo sono in JavaScript, in JSON5 e in JSONC, che è ciò che VS Code usa per i propri file di impostazioni. Se chi consuma accetta JSONC puoi tenerle; altrimenti lo strumento di riparazione le toglie.
E i commenti?
JSON non ne ha, per scelta. Douglas Crockford li ha tolti di proposito, sostenendo che venivano usati per infilarci direttive di parsing. Usa JSONC o JSON5, oppure sposta la nota in una chiave come "_comment".