2009-06-04 20 views

Respuesta

117

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

+8

Las comillas no son más simples en muchas situaciones, como los archivos de configuración que se editan a mano. Lo desafortunado de que JSON se use (y se use incorrectamente) como un formato de intercambio casi universal es que tiene características específicas de Javascript. – miguel

+5

Motivo real: marque esta respuesta también - http://stackoverflow.com/questions/4201441/es-es-en-cualquier- práctica-razón-a-utilizar-cadenas-contributos-para-json-keys – TechMaze

5

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

string 
    "" 
    " chars " 
120

Usted está en lo correcto al usar cadenas como la clave. He aquí un extracto de RFC 4627 - El application/json Tipo de soporte para JavaScript Object Notation (JSON)

2,2. Objetos

Una estructura de objeto se representa como un par de llaves que rodean cero o más pares de nombre/valor (o miembros). Un nombre es cadena. Un solo punto aparece después de cada nombre, separando el nombre del valor. Una coma individual separa un valor del siguiente nombre . Los nombres dentro de un objeto DEBERÍAN 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 familia de lenguajes de programación C . Una cadena comienza y termina con comillas . [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Leer todo el RFC here.

+8

Y para terminar el pensamiento , la sección 2.5 dice: 'Una cadena comienza y termina con comillas'. – rakslice

+0

Gracias @rakslice. He actualizado la respuesta – PatrikAkerstrand

+1

Último RFC: http://tools.ietf.org/html/rfc7159 – Necreaux

11

De 2.2. Objetos

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

y de 2.5.Cadenas

Una cadena comienza y termina con comillas.

, así que diría que de acuerdo a la norma: Sí, usted debe indicar siempre la llave (aunque algunos programas de análisis pueden ser más tolerantes)

-2

Ya que se puede poner "parent.child" separada por puntos y se no tiene que poner parent ["child"] que también sea válido y útil, yo diría que ambas maneras son técnicamente aceptables. Todos los analizadores deberían hacer las dos cosas bien. Si su analizador no necesita comillas en las teclas, entonces es mejor no ponerlas (ahorra espacio). Tiene sentido llamarlos cuerdas porque eso es lo que son, y dado que los corchetes le dan la capacidad de usar valores para las teclas, tiene perfecto sentido no hacerlo. En JSON se puede poner ...

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

>obj 
Object {someKey: "someValue"} 

muy bien sin problemas, si necesita un valor para una clave y ninguno citado no va a funcionar, así que si no lo hace, no se puede, por lo no lo hará "no necesita cotizaciones en las llaves". Incluso si es correcto decir que técnicamente son cadenas. La lógica y el uso discuten lo contrario. Tampoco emite oficialmente Objeto {"someKey": "someValue"} para obj en nuestro ejemplo ejecutado desde la consola de cualquier navegador.

+0

Tanto la respuesta aceptada como el RFC que define JSON dicen que las comillas son obligatorias. –

+0

Eso es cierto, pero vale la pena señalar que lógicamente no es necesario. Supongo que un resultado de la notación de objetos JavaScript de la consola de todos los navegadores es incorrecto, y deberíamos decirle a alguien que lo arregle. Tal vez lo que una consola del navegador genera para un objeto no es JSON, así que tal vez JSON como la especificación define no es necesario ni implementado de esa manera en la mayoría de los lugares. De todos modos, solo quería presentar el caso, que mira los hechos bajo una luz diferente. Realmente tal vez la especificación debería ser cambiada, "Llaves cotizadas" simplemente no es necesaria en ningún lugar que me importe personalmente. (Simplemente no se usa de esa manera en la práctica). –

+0

Está mezclando tres cosas diferentes: JSON, literales de objetos de JavaScript y salida de consola de herramientas de desarrollador de navegador. Cuando escribe su 'obj' en la consola, el navegador muestra alguna representación legible del objeto. Puede mostrarlo como un objeto literal (como lo hizo en su ejemplo), o puede usar alguna otra representación, incluso una interactiva. Los literales de objeto de JavaScript no requieren comillas alrededor de un nombre de clave si la clave es un identificador válido y no una palabra reservada. Sin embargo, JSON _always_ requiere citas de nombres clave. –

Cuestiones relacionadas