2009-05-19 2 views
12

Sto usando Firefox 3.5b4.JSON.parse() richiede virgolette doppie?

This avvisi [object Object], [object Object]:

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

Questa avverte una stringa vuota, cioè jsonObjects è nullo.

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

Allo stesso modo per i nomi di proprietà non quotati, cioè {foo: '1', bar: 2}.

Cosa sta succedendo? Mi manca qualcosa di ovvio, o c'è una regola sulla quotazione doppia e singola con JSON.parse? Tutte e tre le versioni funzionano bene con eval.

risposta

28

Lo standard JSON richiede virgolette.

Ricordare che JSON non è solo "scrivere un oggetto JS". È una sintassi molto rigorosa che può essere anche leggibile come oggetto JS. Non tutte le sintassi valide per JS sono JSON validi. In effetti, il tuo esempio non è JSON realmente valido, poiché è una matrice di oggetti mentre lo standard specifica che il costrutto superiore DEVE essere un oggetto.

Naturalmente, la maggior parte dei parser JSON è più flessibile, consentendo opzioni non standard (come le virgolette singole); ma non fare affidamento su quello.

+3

Dove dice che la struttura superiore deve essere un oggetto? [Questo documento] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) fornisce un esempio di un solo array, e [json.org] (http://json.org/) non lo fa Sembra che questo requisito sia specificato. – Brendon

+0

http://stackoverflow.com/a/4201631/977939 questo ha la spiegazione: parole di riserva. – jpillora

2

Per aggiungere a quello che Javier ha detto, JSON limita il formato principalmente per motivi di sicurezza (quindi non è possibile chiamare le funzioni, ecc.). Se non sei preoccupato per la sicurezza, usa la funzione "eval()" di javascript per convertire la stringa in un oggetto.

+1

Non utilizzare eval se si prevede di utilizzare questo codice in un componente aggiuntivo. – sdwilsh