2009-05-19 46 views
12

Estoy usando Firefox 3.5b4.¿JSON.parse() requiere comillas dobles?

Esto alerta [Objeto], [Objeto objeto]:

var jsonString = '[{"foo": "one", "bar": 1}, {"foo": "two", "bar": 2}]'; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

Esto alerta una cadena vacía, es decir jsonObjects es nulo.

var jsonString = "[{'foo': '1', 'bar': 2}, {'foo': '3', 'bar': 4}]"; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

Del mismo modo para nombres de propiedades sin comillas, es decir {foo: '1', barra: 2}.

¿Qué está pasando? ¿Me estoy perdiendo algo obvio, o hay una regla sobre citas dobles e individuales con JSON.parse? Las tres versiones funcionan bien con eval.

Respuesta

28

El JSON mandatos estándar comillas dobles.

Recuerde que JSON no es sólo "escribir un objeto JS". Es una sintaxis muy estricta que también es legible como un objeto JS. No todas las sintaxis válidas de JS son JSON válidas. De hecho, su ejemplo realmente no es válido, ya que es una matriz de objetos, mientras que el estándar especifica que la construcción superior DEBE ser un objeto.

Por supuesto, la mayoría de los analizadores JSON son más flexibles, lo que permite opciones no estándar (como comillas simples); pero no confíes en eso.

+3

¿Dónde dice que la estructura superior debe ser un objeto? [Este documento] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) da un ejemplo de solo una matriz, y [json.org] (http://json.org/) doesn Parece que no especifica este requisito. – Brendon

+0

http://stackoverflow.com/a/4201631/977939 esto tiene la explicación: reservar palabras. – jpillora

2

que añadir a lo que dijo Javier, JSON limita el formato principalmente por razones de seguridad (por lo que las funciones no pueden ser llamadas, etc.). Si no le preocupa la seguridad, use la función "eval()" de javascript para convertir la cadena en un objeto.

+1

No use eval si planea usar este código en un complemento. – sdwilsh

Cuestiones relacionadas