Le chiavi JSON devono essere racchiuse tra virgolette?


236

Esempio: il seguente codice è valido rispetto alle specifiche JSON ?

{
    precision: "zip"
}

O dovrei sempre usare la sintassi seguente? (E se sì, perché?)

{
    "precision": "zip"
}

Non ho davvero trovato nulla al riguardo nelle specifiche JSON. Sebbene usino le virgolette intorno alle loro chiavi nei loro esempi.

Risposte:


147

Sì, sono necessarie le virgolette. Questo per renderlo più semplice ed evitare di dover avere un altro metodo di escape per le parole chiave riservate javascript, ad es {for:"foo"}.


12
Le virgolette non sono più semplici in molte situazioni, come i file di configurazione che vengono modificati manualmente. La cosa spiacevole di JSON utilizzato (e utilizzato in modo improprio) come un formato di interscambio quasi universale è che ha caratteristiche specifiche di Javascript.
miguel

12
Motivo reale - controllare questa risposta troppo - stackoverflow.com/questions/4201441/...
TechMaze

3
Tl; dr: non volevano trattare la limitazione ECMAScript su parole chiave riservate (non quotate) come chiavi, quindi hanno semplicemente richiesto di citare tutte le chiavi.
BallpointBen,

136

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

2.2. Oggetti

Una struttura di oggetti è rappresentata come una coppia di parentesi graffe che circondano zero o più coppie nome / valore (o membri). Un nome è una stringa . Un singolo punto 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 DOVREBBERO essere univoci.

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

member = string name-separator value

[...]

2.5. stringhe

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

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Leggi l'intero RFC qui .


11
E per finire il pensiero, sezione 2.5 dice: A string begins and ends with quotation marks..
Rakslice,

13

Dal 2.2. Oggetti

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

e da 2.5. stringhe

Una stringa inizia e termina con le virgolette.

Quindi direi che secondo lo standard: sì, dovresti sempre citare la chiave (anche se alcuni parser potrebbero essere più indulgenti)


7

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

string
    ""
    " chars "

0

Si lo fanno. Ma se hai bisogno diversamente, dai un'occhiata a JSON5 .

JSON5 è un superset di JSON che consente la sintassi ES5, tra cui:

  • chiavi di proprietà non quotate
  • stringhe a virgoletta singola, con escape e multilinea
  • formati numerici alternativi
  • Commenti
  • spazio extra

L'implementazione di riferimento JSON5 ( json5pacchetto npm ) fornisce un JSON5oggetto che ha parsee stringifymetodi con gli stessi argomenti e semantica JSONdell'oggetto incorporato .


-2

Dato che puoi inserire la notazione punteggiata "parent.child" e non devi inserire parent ["child"] che è anche valido e utile, direi che entrambi i modi sono tecnicamente accettabili. Tutti i parser dovrebbero fare entrambe le cose bene. Se il tuo parser non ha bisogno di virgolette sui tasti, probabilmente è meglio non metterli (risparmia spazio). Ha senso chiamarli stringhe perché è quello che sono, e poiché le parentesi quadre ti danno la possibilità di usare i valori per le chiavi, in pratica ha perfettamente senso non farlo. In Json puoi mettere ...

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

>obj
Object {someKey: "someValue"}

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


2
Sia la risposta accettata che la RFC che definisce JSON affermano che le virgolette sono obbligatorie.
Keith Thompson,

Questo è vero, ma vale la pena notare che logicamente non è necessario. Suppongo che l'output di una notazione oggetto JavaScript da tutte le console del browser sia errato e dovremmo dire a qualcuno di risolverlo. Forse ciò che una console del browser genera in uscita per un oggetto non è JSON, quindi forse JSON come definito dalle specifiche non è necessario né implementato in questo modo nella maggior parte dei luoghi. Ad ogni modo, volevo solo presentare il caso, che esamina i fatti sotto una luce diversa. Davvero forse le specifiche dovrebbero essere cambiate allora, "Chiavi citate" semplicemente non è necessario in nessun luogo che conta per me personalmente. (In pratica non viene usato in questo modo.)
Master James

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

3
Come ulteriori esempi, invece di digitare objnella console, provare JSON.stringify(obj). Ora vedrai una rappresentazione JSON valida dell'oggetto, completa di un nome chiave tra virgolette. Al contrario, per vedere se una stringa è JSON valida, provare JSON.parse(string). Se le chiavi non sono quotate, ciò genererà un'eccezione. Ad esempio, JSON.parse('{"a":"b"}')avrà successo, ma JSON.parse('{a:"b"}')fallirà.
Michael Geary,

1
OTOH, il tuo utilizzo var obj = {[keyName]:"someValue"};è molto interessante! Non sapevo che potessi farlo in un oggetto JavaScript letterale. Un po 'di controllo mostra che si tratta di qualcosa di nuovo in ES6: non è possibile farlo in ES5.
Michael Geary,
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.