La especificación JSON dice que JSON es un objeto o una matriz. En el caso de un objeto,
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 luego, la especificación dice que una cadena está entre comillas.
¿Por qué?
Así,
{"Property1":"Value1","Property2":18}
y no
{Property1:"Value1",Property2:18}
Pregunta 1 : ¿por qué no permitir que el nombre en los pares de nombre / valor sean identificadores sin comillas?
Pregunta 2 : ¿Existe una diferencia semántica entre las dos representaciones anteriores, cuando se evalúan en Javascript?
javascript
json
Cheeso
fuente
fuente
eval()
(es decir, javascript).Respuestas:
La filosofía de diseño de JSON es "Keep it simple"
"Citar nombres con
"
" es mucho más simple que "Puede citar nombres con"
o,'
pero no es necesario, a menos que contengan ciertos caracteres (o combinaciones de caracteres que lo convertirían en una palabra clave)'
o es"
posible que deba citarse según en el delimitador que seleccionó " .No. En JavaScript son idénticos.
fuente
JSON.parse
función:JSON.parse('{"a":1}')
funciona bien , ¿por quéJSON.parse('{a:1}')
generará una excepción ?JSON.parse
es un analizador JSON implementado en JavaScript, no es un analizador de JavaScript.Les dejo una cita de una presentación que Douglas Crockford (el creador del estándar JSON) le dio a Yahoo.
Habla sobre cómo descubrió JSON y, entre otras cosas, por qué decidió usar claves entre comillas :
Puede encontrar el video completo y la transcripción aquí .
fuente
{ a }
donde la propiedad 'a' copia el valor de una variable global o local 'a'.{[key]: value}
:
Se permiten tanto los espacios en blanco como los identificadores. Sin las comillas, esto causaría ambigüedad al intentar determinar qué constituye exactamente el identificador.fuente
En javascript, los objetos se pueden usar como una tabla hash / hash con pares de claves.
Sin embargo, si su clave tiene caracteres que javascript no podría convertir en un nombre, fallaría al intentar acceder como una propiedad en un objeto en lugar de una clave.
Los identificadores a veces pueden tener caracteres que no se pueden evaluar como token / identificador en javascript, por lo tanto, es mejor poner todos los identificadores en cadenas para mantener la coherencia.
fuente
Creo que la respuesta correcta a la pregunta de Cheeso es que la implementación superó la documentación. Ya no requiere una cadena como clave, sino algo más, que puede ser una cadena (es decir, entre comillas) o (probablemente) cualquier cosa que se pueda usar como nombre de variable, lo que supongo que significa comenzar con una letra, _ , o $, e incluya solo letras, números y $ y _.
Quería simplificar el resto para la próxima persona que visite esta pregunta con la misma idea que yo. Aquí está la carne:
Los nombres de las variables no se interpolan en JSON cuando se usan como clave de objeto (¡Gracias Friedo!)
Breton, utilizando "identificador" en lugar de "clave", escribió que "si un identificador es una palabra reservada, se interpreta como esa palabra en lugar de como un identificador". Esto puede ser cierto, pero lo intenté sin ningún problema:
=> 6
Sobre el uso de comillas, Quentin escribió "... pero no es necesario, a menos que [la clave] contenga ciertos caracteres (o combinaciones de caracteres que la convertirían en una palabra clave)".
Encontré que la parte anterior (ciertos caracteres) es verdadera, usando el signo @ (de hecho, creo que $ y _ son los únicos caracteres que no causan el error):
=> Error de sintaxis
=> 1
pero el paréntesis sobre las palabras clave, como mostré anteriormente, no es cierto.
Lo que quería funciona porque el texto entre la apertura {y los dos puntos, o entre la coma y los dos puntos para las propiedades posteriores se usa como una cadena sin comillas para hacer una clave de objeto, o, como dijo Friedo, un nombre de variable no lo hace ' t se interpola:
=> ABC123
fuente
Si json describe objetos, en la práctica obtienes lo siguiente
por lo que entonces,
por lo que incluso si sus ejemplos producen el mismo resultado, sus equivalentes en "código sin formato" no lo harían. ¿¿Tal vez por eso?? no sé, sólo una idea.
fuente
{ bar: 'goodbye' }
no establecerá el nombre de la clave en el valor debar
, simplemente lo serábar
. Los demás tienen razón sobre la razón por la que la especificación requiere comillas: es para evitar conflictos de palabras clave y caracteres especiales.Puede reducir el tamaño de los datos si las comillas en el nombre solo se permiten cuando sea necesario
fuente