¿Hay alguna razón práctica para usar cadenas entre comillas para claves JSON?

87

Según json.org de Crockford , un objeto JSON se compone de miembros , que se compone de pares .

Cada par está formado por una cadena y un valor , y una cadena se define como:

Una cadena es una secuencia de cero o más caracteres Unicode, entre comillas dobles, usando escapes de barra invertida. Un carácter se representa como una sola cadena de caracteres. Una cadena se parece mucho 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 entre comillas dobles, porque la mayoría de los navegadores no requieren el uso de comillas dobles.

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

Ejemplo válido:

{
  "keyName" : 34
}

A diferencia del inválido:

{
   keyName : 34
}
Mark Rogers
fuente
20
"¿Por qué molestarse en hacerlo bien?" Este es el tipo de pensamiento perezoso que lleva a sitios web cargados de marcas no válidas. Preparado para el futuro el código en caso de que algún navegador no requiere comillas dobles.
meagar
21
"¿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 confunda el pensamiento perezoso con el pragmatismo.
Mark Rogers
15
@Mark - "que nadie más hace" ... ¿de dónde sacaste esa idea? el serializador JSON integrado en todas las plataformas principales realiza las cotizaciones adecuadas.
Nick Craver
7
La función json_encode de @Mark Rogers PHP produce JSON válido, con cadenas entre comillas dobles, por ejemplo. ¿Quizás estás pensando en objetos literales en JavaScript? Es cierto que funcionan sin citar las claves, pero eso no es JSON.
JAL
9
Para que conste, hace años, cuando publiqué esto, estaba confundido acerca de la diferencia entre JSON y la notación literal de objeto como sugirió @JAL. Los dos tienen una sintaxis muy similar, lo que finalmente llevó a cierta confusión al describir el problema.
Mark Rogers

Respuestas:

155

La verdadera razón por la que las claves JSON deben estar entre comillas se basa en la semántica de Identifiers of ECMAScript 3.

Las palabras reservadas no se pueden utilizar como nombres de propiedad en literales de objeto sin comillas, por ejemplo:

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

Mientras que si usa comillas, los nombres de las propiedades son válidos:

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

El propio Crockford lo explica en esta charla , querían mantener simple el estándar JSON, y no les gustaría tener todas esas restricciones semánticas:

....

Fue entonces cuando descubrimos el problema de los nombres sin comillas. Resulta que ECMA Script 3 tiene una política de palabras reservadas. Las palabras reservadas deben citarse en la posición clave, lo que realmente es una molestia. Cuando llegué a formular esto en un estándar, no quería tener que poner todas las palabras reservadas en el estándar, porque se vería realmente estúpido.

En ese momento, estaba tratando de convencer a la gente: sí, puedes escribir aplicaciones en JavaScript, realmente va a funcionar y es un buen lenguaje. No quería decir, entonces, al mismo tiempo: ¡y mira esta cosa realmente estúpida que hicieron! Así que decidí, en cambio, citar las claves.
De esa manera, no tenemos que decirle a nadie qué tan bueno es.

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

...

El estándar ECMAScript 5th Edition corrige esto, ahora en una implementación de ES5, incluso las palabras reservadas se pueden usar sin comillas, tanto en literales de objeto como en acceso de miembros ( obj.functionOk en ES5).

Solo para que conste, este estándar está siendo implementado en estos días por los proveedores de software, puede ver qué navegadores incluyen esta función en esta tabla de compatibilidad (consulte Palabras reservadas como nombres de propiedad )

Christian C. Salvadó
fuente
1
@ Mark, de nada. Tenga en cuenta que JSON es simplemente un lenguaje independiente del formato de intercambio de datos, incluso si su sintaxis se inspiró en la sintaxis literal Javascript Object, hay diferencias entre ellos (mucho más que sólo las teclas citadas).
Christian C. Salvadó
2
@CMS, ¿por qué deben ser solo comillas dobles? ¿Por qué las comillas simples no son válidas en JSON?
Pacerier
1
Las comillas simples no están permitidas para mantener el estándar JSON lo más simple posible. JSON solo necesita ser un subconjunto de Javascript, no necesita implementar la mayor cantidad de Javascript posible.
thomasrutter
La especificación de superconjunto JSON5 se adhiere a la sintaxis de ES5 y, por lo tanto, admite claves sin comillas, entre otras cosas. La biblioteca tiene compatibles parsey stringifymétodos.
Iñigo
En ese enlace de la tabla de compatibilidad (en la parte inferior de la respuesta), la entrada de Palabras reservadas se encuentra en la sección Extensiones literales de objeto / matriz . Y TL; DR, todos los navegadores enumerados (todos de los que ha oído hablar y unos 20 más) dicen "Sí".
i336_
16

Sí, es JSON no válido y se rechazará de lo contrario en muchos casos, por ejemplo, jQuery 1.4+ tiene una verificación que hace que JSON sin comillas falle silenciosamente. ¿Por qué no cumplir?

Tomemos otro ejemplo:

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

... todos estos serían válidos con citas, ¿por qué no ser coherentes y utilizarlos en todos los casos, eliminando 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 procesan en la mayoría de los navegadores ... ¿Eso hace que sea menos doloroso de depurar o mantener? En absoluto, todo lo contrario.

Además, @ Matthew hace lo mejor de todo en los comentarios a continuación, esto ya falla, las claves sin comillas arrojarán un error de sintaxis JSON.parse()en todos los navegadores principales (y cualquier otro que lo implemente correctamente), puede probarlo aquí .

Nick Craver
fuente
Sí, tenía algunas aplicaciones ajax antiguas que generaban schonky json en el servidor, que fallaron cuando se actualizaron a jquery 1.4 debido a la falta de comillas dobles alrededor de los nombres de las claves.
JAL
Es posible que desee agregar que todos los navegadores principales JSON.parsetambién lo rechazarán correctamente.
Matthew Flaschen
Tengo curiosidad, ¿en qué caso exactamente JQuery 1.4 fallará silenciosamente con este tipo de json no válido?
Mark Rogers
1
@Mark: en cualquier caso, no está citado correctamente o tiene caracteres no válidos ... básicamente fallará con cualquier JSON no válido.
Nick Craver
Eso es interesante, esa no ha sido mi experiencia con JQuery 1.4. Además, no creo que jquery sea responsable de crear objetos json, ¿no es eso lo que hace el intérprete de JavaScript del navegador? ¿Se refiere a la deserialización de Jquery json?
Mark Rogers
-4

YAML, que de hecho es un superconjunto de JSON, admite lo que desea hacer. Aunque es un superconjunto, te permite mantenerlo tan simple como quieras.

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

Hay bibliotecas para todos los idiomas bajo el sol, incluido JS, por ejemplo, https://github.com/nodeca/js-yaml

usuario1649339
fuente
11
YAML no es un superconjunto de JSON.
John Gibb
para obtener información sobre el motivo: stackoverflow.com/questions/25974485/…
Ben Page