Italiano

Strumenti per sviluppatori · JSON formattatore e validatore

Tutta la grammatica JSON in una pagina: sei tipi di valore, due contenitori

· Sfondo

json standard convalida

Tutta la grammatica JSON in una pagina: sei tipi di valore, due contenitori illustrati con token JSON e un preciso limite di validazione
Illustrazione vettoriale originale ToolAcre

L'intera grammatica di JSON sta in una pagina e conoscerla a memoria rende ovvio ogni errore del validatore. Questo post illustra i sei tipi di valore, i due contenitori e le poche regole che fanno inciampare le persone.

Ogni errore che tu abbia mai visto proviene da una pagina

Ogni errore di sintassi è un'aspettativa infranta in una grammatica compatta. Dopo l'apertura di un oggetto, un parser si aspetta un nome di membro tra virgolette o una parentesi graffa di chiusura; dopo un nome si aspettano i due punti; dopo un valore è prevista una virgola o la fine del contenitore. Leggere un errore come una transizione fallita è più utile che considerare misterioso il carattere segnalato.

ToolAcre accetta i valori JSON standard e gli spazi bianchi, quindi applica due pratici limiti di input. Il testo più lungo di 8,000,000 caratteri viene rifiutato prima dell'analisi e lo scanner annidato oltre i contenitori 512 viene rifiutato anziché attraversato indefinitamente. Questi sono i limiti del prodotto, non i nuovi tipi JSON. Al loro interno la diagnostica identifica il primo punto in cui il flusso del token non riesce più a soddisfare la grammatica.

I sei valori: oggetto, array, stringa, numero, true/false e null, e il fatto che non c'è nient'altro

Un valore JSON è un oggetto, array, stringa, numero, booleano o null. Oggetti e array possono contenere uno qualsiasi dei sei, inclusi più contenitori. L'ortografia letterale è esattamente `true`, `false` e `null`; la capitalizzazione non è flessibile. Token come `True`, `None`, `undefined`, `NaN` e `Infinity` non rientrano nel rigoroso JSON anche quando un'altra lingua ne riconosce alcuni.

Questo breve elenco rende la classificazione un'utile tecnica di debug. In `{"reading": NaN}`, i due punti introducono correttamente un valore, ma `N` non può iniziare alcun valore consentito. Sostituiscilo solo dopo aver deciso cosa dovrebbero significare i dati, magari `null` o uno stato tra virgolette. Uno strumento di sintassi può rifiutare il token; non può scegliere il sostituto della domanda o decidere se il campo vi appartiene.

Oggetti e array: membri separati da virgole, due punti e perché RFC 8259 lascia l'ordine e i nomi duplicati alle implementazioni

Gli oggetti contengono membri name/value separati da virgole. Ogni nome è una stringa tra virgolette doppie seguita da due punti e un valore. Le matrici contengono valori separati da virgole senza nomi o due punti. I contenitori vuoti `{}` e `[]` sono validi, ma una virgola non può iniziare, seguire o apparire due volte. La corrispondenza di ciascun delimitatore al relativo contenitore espone rapidamente molti errori apparenti di "token imprevisti".

Si prevede che i nomi degli oggetti siano univoci, tuttavia l'ortografia duplicata non viene rifiutata da questo validatore. `{"port": 80, "port": 443}` analizza e `JSON.parse` mantiene il valore successivo. La formattazione quindi emette solo quel membro sopravvissuto, quindi il testo precedente non può essere recuperato dal risultato. Le posizioni dell'array si comportano diversamente: ogni elemento rimane presente e il suo ordine fa parte del valore.

Stringhe e numeri precisi

Le stringhe utilizzano virgolette doppie. Una barra rovesciata può introdurre una virgoletta, una barra rovesciata, una barra, `b`, `f`, `n`, `r`, `t` o un escape Unicode a quattro cifre; i caratteri di controllo grezzi sono proibiti. Le virgolette singole sono normali token non validi all'esterno di una stringa. Queste regole spiegano perché i valori letterali JavaScript copiati e il testo su più righe incollato possono sembrare leggibili anche se non superano la rigorosa convalida JSON.

Un numero può avere un segno meno, una parte intera, una frazione opzionale e un esponente opzionale. Non può iniziare con `+`, utilizzare la notazione esadecimale, portare uno zero iniziale prima di un'altra cifra o scrivere un valore non finito. `-0.25e+2` è valido; `01`, `.5`, `2.` e `Infinity` non lo sono. L'analisi controlla la grammatica, non se JavaScript può preservare esattamente ogni cifra.

Spazio bianco e livello superiore

Al di fuori delle stringhe, gli spazi bianchi JSON sono limitati a spazio, tabulazione orizzontale, avanzamento riga e ritorno a capo. Uno spazio unificatore copiato da una pagina web non è intercambiabile con uno spazio ordinario. La formattazione può scegliere liberamente tra gli spazi consentiti attorno ai token, ma deve preservare gli spazi bianchi che appartengono all'interno di una stringa tra virgolette perché tali caratteri sono dati.

Il documento completo può essere qualsiasi singolo valore JSON, non solo un oggetto o un array. `42`, `false` e `"ready"` sono testi di livello superiore validi. Ciò che è vietato è un secondo valore dopo il primo: `42 43` sono due documenti, non uno. Questa distinzione spiega perché JSON delimitato da nuova riga richiede la gestione record per record anziché un'analisi ordinaria dell'intero file.

Esempio realizzato: analisi manuale di un piccolo documento

Prendi `{"order": [17, null, {"paid": true}], "note": "spedisci presto"}`. The root object begins a member named `order`; its value is an array containing a number, null and another object. A comma then introduces `note`, il cui valore è una stringa con un carattere di nuova riga con escape. Ogni due punti, virgola e delimitatore di chiusura ha un ruolo grammaticale.

Ora rimuovi la citazione prima di `paid`. Dopo la parentesi graffa annidata, il parser prevede una parentesi graffa di chiusura o un nome tra virgolette, quindi fallisce in `p`. In alternativa, aggiungi una virgola dopo `true`; il parser accetta la virgola e poi fallisce in `}` perché deve seguire un altro membro. La previsione manuale di tali posizioni trasforma la convalida in conferma e scoraggia le modifiche casuali della punteggiatura.

Ciò che questo non copre

La grammatica non ha data, denaro decimale, binario, UUID o tipo di durata. Le applicazioni solitamente rappresentano questi concetti con stringhe o numeri e impongono convenzioni separatamente. Un timestamp può essere una stringa JSON perfettamente valida pur contenente una data impossibile. Allo stesso modo, un oggetto sintatticamente valido può omettere proprietà richieste o utilizzare unità sbagliate senza violare una singola regola di analisi.

ToolAcre non esegue controlli dello schema, convalida del dominio o canonicalizzazione. Inoltre, non reinterpreta le funzionalità JSON5 o JSONC come commenti e virgole finali. Il suo compito è più ristretto: accettare un testo JSON rigoroso entro i limiti del prodotto, formattare il valore analizzato e identificare gli errori di sintassi. Conserva le domande successive sulla forma e sul significato nel livello di convalida dell'applicazione che la utilizza.

Da asporto: memorizza la grammatica, fidati della posizione

La lista di controllo durevole è breve: sei categorie di valori, nomi di oggetti tra virgolette, solo virgole tra gli elementi, solo due punti tra nomi e valori, stringhe di escape rigorose, ortografia rigorosa dei numeri, quattro caratteri di spazio bianco ed esattamente un valore di livello superiore. Quando un documento fallisce, individua ciò che la grammatica permetteva immediatamente prima della posizione riportata e confronta tale aspettativa con il carattere effettivamente presente.

Fidati della posizione come primo punto impossibile, non sempre del personaggio da cancellare. Una parentesi graffa di chiusura può essere evidenziata perché una virgola precedente prometteva un altro membro; una lettera innocente può essere evidenziata perché manca la citazione di apertura. Riparare la causa, eseguire nuovamente la convalida e ripetere. Per input di grandi dimensioni o estremamente profondi, affronta il limite del prodotto di 8 milioni di caratteri o 512 prima che la diagnostica della sintassi possa essere d'aiuto.