C'è qualche ragione pratica per usare stringhe tra virgolette per chiavi JSON?


87

Secondo json.org di Crockford , un oggetto JSON è composto da membri , che si compongono di coppie .

Ogni coppia è composta da una stringa e un valore , con una stringa definita come:

Una stringa è una sequenza di zero o più caratteri Unicode, racchiusi tra virgolette doppie, utilizzando caratteri di escape backslash. Un carattere è rappresentato come una singola stringa di caratteri. Una stringa è molto simile a una stringa C o Java.

Ma in pratica la maggior parte dei programmatori non sa nemmeno che una chiave JSON dovrebbe essere racchiusa tra virgolette doppie, perché la maggior parte dei browser non richiede l'uso di virgolette doppie.

Ha senso preoccuparsi di racchiudere il tuo JSON tra virgolette doppie?

Esempio valido:

{
  "keyName" : 34
}

Al contrario dell'invalido:

{
   keyName : 34
}

20
"Perché preoccuparsi di farlo bene?" Questo è il tipo di pensiero pigro che porta a siti Web carichi di markup non valido. A prova di futuro il codice nel caso in cui alcuni del browser non richiede le virgolette doppie.
meagar

21
"Perché preoccuparsi di farlo bene?" - Perché preoccuparsi di seguire una convenzione che nessun altro fa, se non c'è un reale vantaggio? Forse confondi il pensiero pigro con il pragmatismo.
Mark Rogers

15
@Mark - "che nessun altro fa" ... dove hai avuto questa idea? il serializzatore JSON integrato in ogni piattaforma principale fa la quotazione corretta.
Nick Craver

7
La funzione json_encode di @Mark Rogers PHP produce un JSON valido, ad esempio con stringhe tra virgolette doppie. Forse stai pensando a letterali oggetto in JavaScript? È vero che funzionano senza citare le chiavi, ma non è JSON.
JAL

9
Per la cronaca, anni fa, quando ho pubblicato questo, ero confuso sulla differenza tra JSON e notazione letterale dell'oggetto come suggerito da @JAL. I due hanno una sintassi molto simile, questo alla fine ha portato a una certa confusione nella descrizione del problema.
Mark Rogers

Risposte:


155

Il vero motivo per cui le chiavi JSON dovrebbero essere tra virgolette, si basa sulla semantica degli identificatori di ECMAScript 3.

Le parole riservate non possono essere utilizzate come nomi di proprietà negli oggetti letterali senza virgolette, ad esempio:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Mentre se usi le virgolette i nomi delle proprietà sono validi:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Il proprio Crockford lo spiega in questo discorso , volevano mantenere semplice lo standard JSON e non vorrebbero avere tutte quelle restrizioni semantiche su di esso:

....

Fu allora che scoprimmo il problema del nome non quotato. Si scopre che ECMA Script 3 ha una politica di parole riservate whack. Le parole riservate devono essere citate nella posizione chiave, il che è davvero un fastidio. Quando sono arrivato a formularlo in uno standard, non volevo mettere tutte le parole riservate nello standard, perché sarebbe sembrato davvero stupido.

A quel tempo, stavo cercando di convincere le persone: sì, puoi scrivere applicazioni in JavaScript, in realtà funzionerà ed è un buon linguaggio. Non volevo dire, quindi, allo stesso tempo: e guarda questa cosa davvero stupida che hanno fatto! Quindi ho deciso, invece, di citare solo le chiavi.
In questo modo, non dobbiamo dire a nessuno di quanto sia schifoso.

Ecco perché, fino ad oggi, le chiavi sono quotate in JSON.

...

Lo standard ECMAScript 5a edizione risolve questo problema, ora in un'implementazione ES5, anche le parole riservate possono essere utilizzate senza virgolette, sia nei letterali oggetto che nell'accesso ai membri ( obj.functionOk in ES5).

Solo per la cronaca, questo standard viene implementato in questi giorni dai fornitori di software, puoi vedere quali browser includono questa funzione in questa tabella di compatibilità (vedi Parole riservate come nomi di proprietà )


1
@Mark, sei il benvenuto. Tieni presente che JSON è semplicemente un formato di interscambio di dati indipendente dalla lingua , anche se la sua sintassi è stata ispirata dalla sintassi Javascript Object Literal, ci sono differenze tra loro (molto più delle semplici chiavi tra virgolette).
Christian C. Salvadó

2
@CMS, quindi perché devono essere solo virgolette doppie? Perché le virgolette singole non sono valide in JSON?
Pacerier

1
Le virgolette singole non sono consentite per mantenere lo standard JSON il più semplice possibile. JSON deve essere solo un sottoinsieme di Javascript, non ha bisogno di implementare quanto più Javascript possibile.
thomasrutter

La specifica del superset JSON5 aderisce alla sintassi ES5 e quindi supporta le chiavi non quotate tra le altre cose. La libreria ha metodi parsee compatibili stringify.
Inigo

In quel collegamento alla tabella di compatibilità (in fondo alla risposta) la voce Parole riservate si trova nella sezione Estensioni letterali oggetto / matrice . E TL; DR, tutti i browser elencati (tutto ciò di cui hai sentito parlare e circa altri 20) dicono tutti "Sì".
i336_

16

Sì, è un JSON non valido e verrà rifiutato altrimenti in molti casi, ad esempio jQuery 1.4+ ha un controllo che fa fallire silenziosamente JSON non quotato. Perché non essere conforme?

Facciamo un altro esempio:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... tutti questi sarebbero validi con virgolette, perché non essere coerenti e utilizzarli in tutti i casi, eliminando la possibilità di un problema?

Un altro esempio comune nel mondo degli sviluppatori web: ci sono migliaia di esempi di HTML non valido che viene visualizzato nella maggior parte dei browser ... questo rende meno doloroso il debug o la manutenzione? Niente affatto, al contrario.

Anche @ Matthew fa il punto migliore di tutti nei commenti qui sotto, questo già fallisce, i tasti non quotati genereranno un errore di sintassi JSON.parse()in tutti i principali browser (e in tutti gli altri che lo implementano correttamente), puoi testarlo qui .


Sì, avevo alcune vecchie app ajax che generavano schonky json lato server, che non funzionava quando veniva aggiornato a jquery 1.4 a causa della mancanza di virgolette doppie attorno ai nomi delle chiavi.
JAL

Potresti aggiungere che anche tutti i principali browser JSON.parselo rifiuteranno correttamente.
Matthew Flaschen

Sono curioso, in quale caso esattamente JQuery 1.4 fallirà silenziosamente con questo tipo di json non valido?
Mark Rogers

1
@Mark - In ogni caso non è citato correttamente o contiene caratteri non validi ... fondamentalmente fallirà con qualsiasi JSON non valido.
Nick Craver

È interessante, non è stata la mia esperienza con JQuery 1.4. Inoltre, non credo che jquery sia responsabile della creazione di oggetti json, non è quello che fa l'interprete javascript del browser? Ti riferisci alla deserializzazione Jquery json?
Mark Rogers

-4

YAML, che in realtà è un superset di JSON, supporta ciò che vuoi fare. Sebbene sia un superset, ti consente di mantenerlo semplice come desideri.

YAML è una boccata d'aria fresca e potrebbe valere la pena di dare un'occhiata. Il posto migliore per iniziare è qui: http://en.wikipedia.org/wiki/YAML

Ci sono librerie per ogni lingua sotto il sole, incluso JS, ad esempio https://github.com/nodeca/js-yaml


11
YAML non è un superset di JSON.
John Gibb

per informazioni sul perché: stackoverflow.com/questions/25974485/…
Ben Page
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.