Italiano

Strumenti per sviluppatori · JSON formattatore e validatore

Letterali oggetto JavaScript vs JSON: perché le virgolette singole non superano la convalida

· Come funziona

json flusso di lavoro dello sviluppatore convalida

Letterali oggetto JavaScript vs JSON: perché le virgolette singole falliscono la convalida illustrata con token JSON e un limite di convalida preciso
Illustrazione vettoriale originale ToolAcre

Un oggetto stampato da una console JavaScript assomiglia a JSON ma solitamente non lo è. Questo post elenca le differenze esatte (virgolette, chiavi senza virgolette, non definite, funzioni) e mostra dove ognuna fa scattare un validatore.

È uscito dalla console, quindi perché non è valido?

È uscito dalla console, quindi perché non è valido? — le console per sviluppatori visualizzano i valori JavaScript come testo JavaScript simile all'origine, non come serializzazione JSON garantita. Un oggetto copiato può contenere nomi di proprietà semplici, stringhe tra virgolette singole, `undefined` o annotazioni specifiche del browser. Tutti questi possono essere comprensibili a un motore JavaScript o a un lettore umano mentre falliscono immediatamente in un file `.json`, la cui grammatica è intenzionalmente più piccola e indipendente dal codice eseguibile.

Considera `{name: "Ada", active: true, missing: undefined}`. Le parentesi graffe, i due punti e il valore booleano assomigliano a JSON, ma la prima chiave nuda viola già la regola del membro dell'oggetto e `undefined` fallirebbe in seguito. ToolAcre segnala il primo carattere o valore non supportato con una riga e una colonna, quindi è meglio eseguire la conversione in ordine.

Le stringhe devono utilizzare virgolette doppie

Le stringhe devono utilizzare virgolette doppie: JSON definisce una stringa come caratteri racchiusi tra `"`, con la barra rovesciata dove richiesto. Una virgoletta singola non ha alcun ruolo come delimitatore di stringa. Quando un validatore incontra `'Ada'`, non inizia una stringa e poi si oppone al suo contenuto; rifiuta l'apostrofo di apertura stesso. Ciò si applica allo stesso modo ai nomi delle proprietà e ai valori delle stringhe, anche se JavaScript consente entrambi gli stili di virgolette per i propri valori letterali.

La conversione delle virgolette richiede più attenzione rispetto alla sostituzione globale di ogni apostrofo. Un apostrofo all'interno di un testo come `Ada's profile` è un contenuto ordinario una volta che il valore è racchiuso tra virgolette doppie, mentre le virgolette doppie esistenti all'interno di quel contenuto devono essere sottoposte a escape. Il modulo JSON valido è `"Ada's "profile""`.

Le chiavi devono essere stringhe tra virgolette

Le chiavi devono essere stringhe tra virgolette: i valori letterali dell'oggetto JavaScript consentono nomi in stile identificatore come `{name: 1}` e nomi calcolati come `{[expression]: 1}`. JSON non consente né l'abbreviazione né l'altra. Dopo una parentesi graffa o una virgola, il membro successivo deve iniziare con una stringa tra virgolette doppie, seguita da due punti. La rappresentazione valida è `{"name": 1}`. Un validatore che punta al `n` identifica il luogo esatto in cui è stato richiesto un preventivo.

Citare ogni chiave rimuove anche l'ambiguità attorno a spazi, trattini e parole riservate. JavaScript potrebbe richiedere una sintassi di origine diversa per questi casi, ma JSON utilizza una regola coerente: `"display-name"`, `"first name"` e `"default"` sono tutti nomi di membri ordinari. Anche i tasti dall'aspetto numerico sono stringhe.

I valori JSON semplicemente non hanno

I valori JSON semplicemente non hanno: il suo vocabolario di valori è oggetto, array, stringa, numero, `true`, `false` e `null`. Non sono presenti `undefined`, `NaN`, `Infinity`, funzioni, espressioni regolari, BigInt o Date letterali. I commenti sono assenti dalla grammatica e i numeri non possono utilizzare segni esadecimali, binari, segni più iniziali o separatori numerici JavaScript. Ogni costrutto preso in prestito alla fine raggiunge un carattere che non può iniziare o continuare un valore JSON valido.

La conversione richiede una decisione sui dati piuttosto che un trucco di ortografia. Sostituisci `undefined` con `null` solo se un valore vuoto esplicito corrisponde al contratto dell'applicazione; in caso contrario rimuovere il membro o fornire un valore reale. Codifica le date come stringhe concordate, spesso ISO 8601. Rappresenta i numeri non finiti secondo il API ricevente invece di inventare un token JSON.

Esempio realizzato: conversione di un dump della console in JSON valido

Esempio realizzato: conversione di un dump della console in un JSON valido: iniziare con `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Citazione `name`, `active`, `score` e `updated` tra virgolette doppie. Modificare il valore del nome in una stringa tra virgolette doppie. Decidi che un punteggio non disponibile dovrebbe essere `null` e sostituisci l'espressione del costruttore con la stringa di timestamp effettiva che avrebbe dovuto produrre. Il documento ora contiene solo JSON membri e valori.

La forma finita potrebbe essere `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. Convalida dopo ogni categoria di riparazione perché il primo errore può nascondere la successiva sintassi JavaScript-only. La formattazione del risultato accettato ne espone quindi la struttura senza eseguire ulteriori conversioni.

La trappola inversa: JSON valido che JavaScript verrebbe letto diversamente, come numeri interi molto grandi e la chiave __proto__

La trappola inversa: JSON valido può ancora acquisire comportamenti o limitazioni specifici di JavaScript dopo l'analisi. I numeri JSON non hanno limiti di precisione incorporati nella grammatica, ma JSON.parse produce valori numerici JavaScript. Un numero intero oltre l'intervallo sicuro può quindi essere arrotondato in modo silenzioso. Se ogni cifra è importante, codifica l'identificatore come una stringa o utilizza un parser e un tipo di dati progettati per preservare numeri di precisione arbitraria anziché fidarsi di un controllo della sintassi riuscito.

Il nome del membro `"__proto__"` è valido anche JSON e JSON.parse lo crea come una propria proprietà dei dati. I problemi possono iniziare in seguito se il codice dell'applicazione copia le proprietà analizzate in un altro oggetto con un comportamento di assegnazione o unione non sicuro. La validazione dimostra che il testo segue la grammatica JSON; non dimostra che ogni chiave sia sicura per ogni consumatore.

Ciò che questo non copre

Ciò che questo non copre: JSON5, JSONC e linguaggi di configurazione che accettano deliberatamente commenti, virgole finali, nomi senza virgolette o stringhe con virgolette singole. Questi formati risolvono diversi problemi di creazione e necessitano di parser che implementino le proprie grammatiche. Un rigoroso validatore JSON non dovrebbe reinterpretarli silenziosamente, perché accettare una sintassi aggiuntiva renderebbe il risultato fuorviante per API, metadati del pacchetto e altre destinazioni che richiedono realmente lo standard JSON.

Questa distinzione esclude anche la valutazione arbitraria JavaScript. L'esecuzione del testo incollato tramite `eval` o un costruttore di funzioni semplicemente per trasformare un oggetto letterale in dati può eseguire getter, chiamate o altre espressioni ostili. Se l'origine è attendibile JavaScript sotto il tuo controllo, serializza il valore effettivo con JSON.stringify. Se la fonte è un testo non attendibile, non eseguirlo.

Takeaway: un letterale è codice, JSON sono dati

Conclusione: un letterale è codice, JSON sono dati: la somiglianza visiva non rende le loro grammatiche intercambiabili. JSON richiede stringhe e nomi di membri tra virgolette doppie, consente solo un piccolo insieme fisso di tipi di valore e non contiene commenti o espressioni eseguibili. Una diagnostica di riga e colonna segna il primo posto in cui la fonte copiata lascia quella grammatica. Riparare quel punto e convalidarlo nuovamente è più affidabile che applicare un'ampia ricerca e sostituzione a un dump della console.

Quando controlli il valore JavaScript, genera JSON con JSON.stringify invece di copiare la sua rappresentazione della console. Quando ricevi del testo, analizzalo solo con il parser per il suo formato dichiarato e non eseguirlo mai come scorciatoia. Una convalida JSON riuscita stabilisce la sintassi, non la precisione numerica, la conformità dello schema o la gestione sicura delle proprietà downstream.