2009-06-04 9 views

risposta

117

Sì, avete bisogno di virgolette. Questo per renderlo più semplice e per evitare di dover avere un altro metodo di escape per le parole chiave riservate javascript, ovvero {for:"foo"}.

+8

Le virgolette non sono più semplici in molte situazioni, come i file di configurazione modificati a mano. La sfortunata cosa in cui JSON viene usato (e usato male) come formato di scambio quasi universale è che ha caratteristiche specifiche per Javascript. – miguel

+5

Vero motivo: controlla anche questa risposta: http://stackoverflow.com/questions/4201441/is-there-any-practical-reason-to-use-quot-strings-for-json-keys – TechMaze

5

Sì, le quotazioni sono obbligatorie. http://json.org/ dice:

string 
    "" 
    " chars " 
120

È corretto utilizzare stringhe come chiave. Ecco un estratto dal RFC 4627 - L'application/json tipo di supporto per JavaScript Object Notation (JSON)

2,2. Oggetti

Una struttura di oggetto è rappresentata come una coppia di parentesi graffe che circondano zero o più coppie nome/valore (o membri). Un nome è una stringa . Un singolo due punti viene dopo ogni nome, separando il nome dal valore. Una singola virgola separa un valore dal seguente nome . I nomi all'interno di un oggetto DOVREBBE essere unici.

object = begin-object [ member *(value-separator member) ] end-object

member = string name-separator value

[...]

2.5. Archi

La rappresentazione di stringhe è simile alle convenzioni utilizzate nella famiglia di linguaggi di programmazione C . Una stringa inizia e termina con virgolette . [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Leggi tutta la RFC here.

+8

E per finire il pensiero , la sezione 2.5 dice: 'Una stringa inizia e finisce con le virgolette .'. – rakslice

+0

Grazie a @rakslice. Ho aggiornato la risposta – PatrikAkerstrand

+1

RFC più recente: http://tools.ietf.org/html/rfc7159 – Necreaux

11

Da 2.2. Oggetti

Una struttura oggetto è rappresentato come una coppia di parentesi graffe circondano zero o più coppie nome/valore (o membri). Un nome è una stringa.

e da 2.5.Strings

Una stringa inizia e finisce con virgolette.

quindi direi che secondo lo standard: Sì, si dovrebbe sempre citare la chiave (anche se alcuni parser possono essere più indulgente)

-2

Dal momento che si può mettere "parent.child" notazione a punti e si non devo mettere un genitore ["figlio"] che sia anche valido e utile, direi che entrambi i modi sono tecnicamente accettabili. Tutti gli analizzatori dovrebbero fare entrambe le cose bene. Se il tuo parser non ha bisogno di virgolette sulle chiavi, probabilmente è meglio non metterle (risparmia spazio). Ha senso chiamarli stringhe perché è quello che sono, e dal momento che le parentesi quadre ti danno la possibilità di usare i valori per le chiavi in ​​sostanza ha perfettamente senso non farlo. in JSON si può mettere ...

>var keyName = "someKey"; 
>var obj = {[keyName]:"someValue"}; 

>obj 
Object {someKey: "someValue"} 

bene senza problemi, se avete bisogno di un valore per una chiave e nessuno citato non funziona, quindi se non lo fa, non si può così, non sarà così "non hai bisogno di virgolette sulle chiavi". Anche se è giusto dire che sono tecnicamente stringhe. La logica e l'uso argomentano diversamente. Né esce ufficialmente Object {"someKey": "someValue"} per obj nel nostro esempio viene eseguito dalla console di qualsiasi browser.

+0

Sia la risposta accettata che la RFC che definisce JSON dicono che le virgolette sono obbligatorie. –

+0

Questo è vero, ma vale la pena notare che logicamente non è necessario. Suppongo che un output di Notazione oggetto JavaScript dalla console di tutti i browser sia errato e dovremmo dire a qualcuno di risolverlo. Forse ciò che una console Browser emette per un oggetto non è JSON, quindi forse JSON come la specifica definisce non è necessaria né implementata in questo modo nella maggior parte dei luoghi. Ad ogni modo volevo solo fare il caso, che guarda i fatti in una luce diversa. Davvero forse le specifiche dovrebbero essere cambiate quindi, "Quoted Keys" non è semplicemente necessario ovunque sia importante per me personalmente. (Non è usato in questo modo nella pratica.) –

+0

Stai mescolando tre cose diverse: JSON, letterali agli oggetti JavaScript e output della console degli strumenti di sviluppo del browser. Quando digiti il ​​tuo 'obj' nella console, il browser visualizza una rappresentazione leggibile dall'uomo dell'oggetto. Può visualizzarlo come oggetto letterale (come nel tuo esempio), oppure può usare qualche altra rappresentazione, anche interattiva. I valori letterali dell'oggetto JavaScript non richiedono virgolette attorno al nome di una chiave se la chiave è un identificatore valido e non una parola riservata. Tuttavia, JSON ha sempre delle virgolette sui nomi delle chiavi. –