2010-11-17 11 views
68

Según Crockford de json.org, un objeto JSON se compone de miembros, que se compone de pares.¿Hay alguna razón práctica para usar cadenas entre comillas para claves JSON?

Cada par está hecho de una cadena y un valor, con una cadenase define como:

Una cadena es una secuencia de cero o más caracteres Unicode, envuelto en doble comillas, usando escapes de barra invertida. Un carácter se representa como una única cadena de caracteres . Una cadena es muy muy similar a una cadena C o Java.

Pero en la práctica, la mayoría de los programadores ni siquiera saben que una clave JSON debe estar rodeada de comillas dobles, ya que la mayoría de los exploradores no requieren el uso de comillas dobles.

¿Tiene sentido molestarse en rodear su JSON entre comillas dobles?

Válido Ejemplo:

{ 
    "keyName" : 34 
} 

A diferencia de la nulidad de:

{ 
    keyName : 34 
} 
+11

"¿Por qué se molestan en hacerlo bien?" Este es el tipo de pensamiento perezoso que conduce a sitios web cargados de marcas no válidas. Haga que su código sea a prueba del futuro en caso de que algún navegador * * requiera comillas dobles. – meagar

+13

"¿Por qué molestarse en hacerlo bien?"- ¿Por qué molestarse en seguir una convención que nadie más hace, si no hay un beneficio real? Quizás confundas el pensamiento perezoso con el pragmatismo. –

+12

@Mark -" que nadie más lo hace "... ¿de dónde sacaste esa idea? el serializador JSON integrado en ** cada ** plataforma principal hace las cotizaciones adecuadas. –

Respuesta

123

La verdadera razón de por qué las claves JSON deben estar entre comillas, se basa en la semántica de los identificadores de ECMAScript 3.

Reserved words no se puede utilizar como nombres de propiedades en literales de objetos sin comillas, por ejemplo:

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

Mientras que si utiliza comillas los nombres de propiedades son válidas:

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

La propia Crockford lo explica en this talk, querían mantener el estándar JSON simple, y no les gustaría tener todas esas restricciones semánticas en él:

....

Eso fue cuando descubrimos el problema nombre sin comillas. Resulta que ECMA Script 3 tiene un whack reservado política de palabras. Las palabras reservadas deben ser cotizadas en la posición clave, que es realmente una molestia. Cuando llegué a para formular esto en un estándar, I no quería tener que poner todas las palabras reservadas en el estándar, porque se vería realmente estúpido.

En ese momento, yo estaba tratando de convencer a la gente : sí, se puede escribir aplicaciones en JavaScript, es realidad va a trabajar y es una buena idioma. No quería decir, entonces, al mismo tiempo: ¡y mira esto realmente estúpido que hicieron! Entonces, yo decidí, en cambio, citemos las claves .
De esta manera, no tenemos que decirle a nadie acerca de cómo es.

Es por eso que, hasta el día de hoy, las claves se citan en JSON.

...

La quinta edición estándar ECMAScript corrige esto, ahora en una implementación ES5, incluso palabras reservadas se pueden utilizar sin comillas, en tanto, literales de objetos y el acceso de miembros (obj.function Ok en la ES5) .

Sólo para que conste, esta norma se está aplicando en estos días por proveedores de software, se puede ver lo que los navegadores incluyen esta característica en este compatibility table (ver palabras reservadas como nombres de propiedades)

+3

Guau, eso era todo lo que estaba buscando. ¡Gracias! –

+1

@Mark, de nada. Tenga en cuenta que JSON es simplemente un formato de intercambio de datos * independiente del idioma *, incluso si su sintaxis se inspiró en la sintaxis Javascript Object Literal, existen diferencias entre ellos (mucho más que las claves citadas). – CMS

+2

@CMS, ¿por qué debe ser solo comillas dobles? ¿Por qué las comillas simples son inválidas en JSON? – Pacerier

15

Sí, es JSON válida y se rechazará en caso contrario, en muchos casos, por ejemplo jQuery 1.4+ tiene un cheque que hace que JSON sin cita silenciosa falle. ¿Por qué no cumple?

Tomemos otro ejemplo:

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

... todos ellos habría ser válida con citas, ¿por qué no ser consistente y utilizarlos en todos los casos, lo que elimina la posibilidad de un problema?

Un ejemplo más común en el mundo de los desarrolladores web: hay miles de ejemplos de HTML no válido que se muestran en la mayoría de los navegadores ... ¿eso hace que sea menos doloroso depurar o mantener? No, en absoluto, todo lo contrario.

Además @Matthew hace que el mejor punto de todos en los comentarios a continuación, esta ya falla, las teclas no cotizados lanzarán un error de sintaxis con JSON.parse() en todos los principales navegadores (y cualquier otra persona que lo implementan correctamente), you can test it here.

+0

Sí, tenía algunas aplicaciones antiguas de ajax que generaban schonky json en el servidor, que no funcionaba cuando se actualizaba a jquery 1.4 debido a la falta de comillas dobles para los nombres de las teclas. – JAL

+0

Es posible que desee agregar que todos los navegadores principales '' JSON.parse' también lo rechazarán correctamente. –

+0

Tengo curiosidad, ¿en qué caso exactamente JQuery 1.4 silenciosamente fallará con este tipo de json no válido? –

-3

YAML, que está en de hecho, un superconjunto de JSON, admite lo que desea hacer. A pesar de que es un superconjunto, te permite mantenerlo tan simple como lo desees.

YAML es un soplo de aire fresco y puede valer la pena verlo. El mejor lugar para comenzar es aquí: http://en.wikipedia.org/wiki/YAML

Hay librerías para todos los idiomas bajo el sol, incluyendo JS, por ejemplo https://github.com/nodeca/js-yaml

+5

YAML no es un superconjunto de JSON. –

+0

para obtener información sobre por qué: http://stackoverflow.com/questions/25974485/yaml-as-a-json-superset-and-tab-characters –

Cuestiones relacionadas