JSON Spec - ¿la clave tiene que estar rodeada de comillas?


Ejemplo: ¿Es válido el siguiente código con respecto a la especificación JSON ?

{
    precision: "zip"
}

¿O debería usar siempre la siguiente sintaxis? (Y si es así, ¿por qué?)

{
    "precision": "zip"
}

Realmente no he encontrado algo sobre esto en las especificaciones JSON. Aunque usan citas alrededor de sus claves en sus ejemplos. (Así que voy a hacer eso también por ahora)

Author: bluish, 2009-06-04

5 answers

Sí, necesita comillas. Esto es para hacerlo más simple y evitar tener que tener otro método de escape para las palabras clave reservadas de javascript, es decir, {for:"foo"}.

 123
Author: cobbal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-29 06:32:53

Es correcto usar cadenas como clave. Aquí hay un extracto de RFC 4627-El Tipo de Medio application/json para la Notación de Objetos JavaScript (JSON)

2.2. Objetos

Una estructura de objeto se representa como un par de corchetes rizados alrededor de cero o más pares nombre / valor (o miembros). Un nombre es un string . Un solo dos puntos viene después de cada nombre, separando el nombre del valor. Una sola coma separa un valor de un siguiente nombre. Los nombres dentro de un objeto DEBEN ser únicos.

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

member = string name-separator value

[...]

2.5. Cadenas

La representación de cadenas es similar a las convenciones utilizadas en la C familia de lenguajes de programación. Una cadena comienza y termina con comillas. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Lea todo el RFC aquí.

 126
Author: PatrikAkerstrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 03:23:36

De 2.2. Objetos

Una estructura de objeto se representa como un par de corchetes que rodean cero o más pares nombre/valor (o miembros). Un nombre es una cadena.

Y de 2.5. Cadenas

Una cadena comienza y termina entre comillas.

Así que yo diría que de acuerdo con el estándar: sí, siempre debe citar la clave (aunque algunos analizadores pueden ser más indulgentes)

 11
Author: Cebjyre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 09:29:12

Sí, las cotizaciones son obligatorias. http://json.org / dice:

string
    ""
    " chars "
 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 09:25:41

Ya que puedes poner " padre.niño " notación punteada y usted no tiene que poner padre ["niño"] que también es válido y útil, yo diría que ambos sentidos es técnicamente aceptable. Todos los analizadores deberían funcionar en ambos sentidos. Si su analizador no necesita comillas en las teclas, probablemente sea mejor no ponerlas (ahorra espacio). Tiene sentido llamarlas cadenas porque eso es lo que son, y ya que los corchetes le dan la capacidad de usar valores para claves esencialmente hace perfecto tiene sentido no hacerlo. En Json se puede poner...

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

>obj
Object {someKey: "someValue"}

Está bien sin problemas, si necesita un valor para una clave y ninguna cita no funcionará, por lo que si no lo hace, no puede, por lo que no lo hará por lo que "no necesita comillas en las claves". Incluso si es correcto decir que técnicamente son cuerdas. La lógica y el uso argumentan lo contrario. Tampoco arroja oficialmente Object {"someKey": "someValue"} para obj en nuestro ejemplo se ejecuta desde la consola de cualquier navegador.

 -2
Author: Master James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 01:55:48