Italiano

Strumenti per sviluppatori · JSON formattatore e validatore

Perché una virgola finale interrompe JSON e dove punta il validatore

· Come funziona

json flusso di lavoro dello sviluppatore convalida

Perché una virgola finale interrompe JSON e dove punta il validatore illustrato con token JSON e un preciso limite di convalida
Illustrazione vettoriale originale ToolAcre

La virgola finale è l'errore JSON più comune e l'errore non si verifica mai sulla virgola stessa. Impara cosa prevede la grammatica dopo una virgola e come leggere la posizione riportata.

Il bug di un carattere che richiede dieci minuti per essere trovato

Il bug di un carattere che richiede dieci minuti per essere trovato: una configurazione modificata a mano, una virgola lasciata dopo l'ultima proprietà e una build che fallisce. Un parser rigoroso segue la sequenza di token effettivamente presente nel documento. Considera un oggetto che termina con `'enabled': true,` e un array che termina con `'blue',`: entrambi i separatori promettono un altro elemento anche se il token successivo chiude il contenitore.

ToolAcre non ricava una posizione dal messaggio del motore del browser. JSON.parse decide prima la validità; solo dopo un fallimento lo scanner del repository esamina il testo e segnala il primo carattere inaccettabile. Per una virgola finale, quel carattere è la parentesi graffa o parentesi chiusa e il motivo dice esplicitamente "Virgola finale". In un oggetto manca un altro nome membro citato; in un array manca un altro valore completo.

Cosa dice la grammatica JSON dopo una virgola

Cosa dice la grammatica JSON dopo una virgola — RFC 8259 utilizza le virgole per separare i valori negli array e i membri negli oggetti. Un separatore necessita quindi di un elemento valido su ciascun lato. Dopo una virgola di oggetto, il parser si aspetta un nome tra virgolette doppie, due punti e un valore. Dopo una virgola di array, è previsto qualsiasi valore JSON valido. Un delimitatore di chiusura non soddisfa nessuna delle due produzioni.

Il separatore è compreso tra due membri o elementi, mai dopo quello finale. La rimozione dell'ultima virgola non modifica alcun valore o ordine; ripristina la grammatica che chiude il contenitore subito dopo il suo valore finale. Questo è anche il motivo per cui una virgola può apparire senza problemi dopo ogni elemento precedente: ciascuna di quelle virgole è seguita dall'elemento successivo promesso.

Perché l'errore si verifica sulla parentesi di chiusura

Perché l'errore si trova nella parentesi di chiusura: una virgola è legale nel mezzo di un contenitore, quindi il parser non può rifiutarla semplicemente a vista. Utilizza il separatore e cambia stato per aspettarsi un altro nome o valore. La contraddizione diventa certa solo quando invece arriva `}` o `]`. Quel delimitatore è dove l'elemento promesso risulta assente, anche se la virgola precedente ha causato la transizione di stato.

Il delimitatore riportato è quindi una prova dello stato del parser, non un suggerimento per eliminare la parentesi graffa o parentesi. Leggi un token a sinistra. Se il token è una virgola e il delimitatore chiude lo stesso contenitore, rimuovi la virgola e mantieni la chiusura. Lo scanner di ToolAcre assegna un nome alla condizione della virgola finale e fornisce la posizione di origine dopo che JSON.parse rifiuta il documento.

JavaScript, Python e i linter moderni lo consentono, JSON no

JavaScript, Python e i linter moderni lo consentono, JSON no: i valori letterali del linguaggio di origine spesso consentono una virgola dopo l'ultimo elemento perché rende più facile la revisione delle righe riordinate e delle aggiunte future. I formattatori possono anche inserire o preservare quello stile. Queste comodità appartengono alla grammatica di ogni lingua. Un oggetto letterale `.js` o un dizionario Python può essere un'origine valida mentre la stessa punteggiatura visibile rimane non valida in un documento RFC 8259 JSON.

Di conseguenza, un editor configurato per JavaScript potrebbe non mostrare alcun avviso quando un frammento incollato termina con una virgola. Il parser di destinazione controlla ancora l'accettazione. Utilizza una modalità lingua JSON per il testo `.json` e convalida il payload esatto inviato a un campo API o di configurazione. La clemenza in un file sorgente, linter o parser JSON5 non è una prova trasferibile su un consumatore JSON rigoroso.

Esempio realizzato: tre virgole finali in un file

Esempio realizzato: tre virgole finali in un file: supponiamo che `features` termini con `"beta",`, l'oggetto che lo contiene termini con `"enabled": true,` e un secondo membro root abbia lo stesso errore. La prima convalida si ferma alla parentesi di chiusura dopo `beta`. La rimozione di quella virgola consente di continuare l'analisi fino alla parentesi graffa di chiusura dopo `true` e la riparazione della seconda posizione rivela l'errore rimanente dell'oggetto a livello root.

Questa sequenza è prevista perché i parser generalmente riportano il primo punto in cui la continuazione è impossibile, non ogni difetto successivo. Mappa ogni riga e colonna al suo delimitatore di chiusura, ispeziona il separatore immediatamente prima, apporta una modifica intenzionale ed esegui nuovamente la convalida. Non eliminare in massa tutte le virgole: sono richiesti i separatori tra i vicini effettivi. La convalida ripetuta distingue le tre virgole terminali non valide dalle virgole valide nello stesso documento.

Varianti che producono lo stesso errore

Le varianti che producono errori di separazione correlati: una virgola iniziale, due virgole di fila e una virgola dopo il valore radice, utilizzano tutte in modo improprio lo stesso carattere ma violano stati del parser diversi. Una virgola iniziale non ha alcun elemento completato alla sua sinistra. Le virgole consecutive non forniscono alcun elemento tra i separatori. Una virgola dopo il valore radice completo viene visualizzata quando il testo JSON ha già raggiunto una fine valida.

Questi casi non dovrebbero essere automaticamente etichettati come virgole finali. Il motivo preciso dipende dalla posizione e dallo stato del contenitore. All'interno di `{"a":1,,"b":2}`, la seconda virgola è inaspettata nel punto in cui dovrebbe iniziare il nome di un membro tra virgolette. In `[ ,1]`, la prima virgola viene visualizzata dove è richiesto un valore. Ispeziona i token diagnostici e circostanti anziché applicare una regola universale "elimina la virgola precedente" al di fuori del modello di delimitatore di chiusura.

Ciò che questo non copre

Ciò che questo non copre: JSON5 e alcuni flussi di lavoro JSON-con-commenti consentono deliberatamente le virgole finali. Un file scritto per una di queste grammatiche dovrebbe utilizzare il parser, l'estensione e gli strumenti dichiarati. Trattarlo come JSON rigoroso produrrà errori che riflettono una mancata corrispondenza del formato, non necessariamente un errore di creazione. Al contrario, accettarlo con un parser permissivo non rende l'origine sicura da inviare a un endpoint JSON rigoroso.

Cambiare i parser semplicemente per mettere a tacere questa diagnostica cambia la lingua accettata e può nascondere l'incompatibilità con l'eventuale consumatore. Commenti, nomi senza virgolette e stringhe tra virgolette singole possono accompagnare le virgole finali nei formati estesi, creando ulteriori errori quando il testo supera il limite. Conferma prima il contratto di destinazione. Se dice JSON, rimuovi la sintassi dell'estensione; se dice JSON5 o JSONC, convalida con strumenti che implementano quel formato esatto.

Da asporto: guarda un token a sinistra della posizione segnalata

Conclusione: guarda un token a sinistra della posizione segnalata: quando il cursore si trova sotto `}` o `]`, la virgola precedente potrebbe aver promesso un membro o un elemento che non è mai arrivato. Conservare il delimitatore di chiusura strutturalmente necessario e rimuovere solo quel separatore terminale. Quindi convalida nuovamente l'intero documento, poiché la prima posizione riparata potrebbe scoprire un'altra virgola finale in un contenitore successivo.

ToolAcre mantiene ristrette le responsabilità: JSON.parse decide che il documento non è valido e lo scanner locale fornisce un motivo strutturale stabile più riga e colonna dopo l'errore. Usa quella coordinata per ispezionare il contesto del parser piuttosto che incolpare il carattere evidenziato isolatamente. Una virgola finale è una modifica di un carattere, ma comprendere il motivo per cui l'errore appare sul delimitatore seguente rende affidabile la stessa diagnosi su oggetti, array e configurazioni profondamente annidate.