2012-04-09 14 views
30

Come dimostrato in this jsfiddle, se si dispone di un file JS e si crea un oggetto JSON senza usarlo, si comporta diversamente a seconda che le chiavi (membri) siano avvolte in citazioni o no.Comportamento di parsing JSON strano in js, "Token inaspettato:"

codice valido: { a: 1};
codice non valido: { "a": 1 };

Quello che si ottiene è un messaggio di errore (in Chrome, diverso per FF/IE, ma non riesce ancora sulla sintassi)

Uncaught SyntaxError: Unexpected token :

ma se si utilizza l'oggetto in qualche modo, ad esempio: alert({ "a": 1 });, tutto torna a essere OK.

Perché succede?

risposta

53

La dichiarazione:

{ a: 1 }; 

è non un oggetto letterale. È un'istruzione di blocco con un'espressione etichettata al suo interno. È valido

questo:

{ "a": 1 }; 

è un errore di sintassi, perché non è solo parseable. Il quotato "a" inizia un'istruzione di espressione all'interno del blocco, ma poi il token successivo dopo che la stringa è di due punti e non c'è alcuna forma di espressione che assomigli a un'espressione seguita da due punti.

Ora:

var x = { "a": 1 }; 

opere perché il "{" non è interpretato come l'inizio di una dichiarazione di blocco. Questa affermazione inizia con var, quindi è una dichiarazione di variabile. All'interno dell'espressione sul lato destro del token "=", l'unica cosa che un "{" può significare è l'inizio di un oggetto letterale. Allo stesso modo, si noti che:

({ "a": 1 }); 

è OK perché la parentesi di apertura rende il parser si aspetta una sottoespressione nidificato, così ancora una volta la "{" senza ambiguità significa che è l'inizio di un oggetto letterale.

+0

ma assegnarlo a una variabile lo rende un oggetto letterale? – karnyj

+0

Sì, perché non c'è ambiguità. – Pointy

+5

javascript internals sono davvero qualcosa :) grazie – karnyj

2

Questo errore può verificarsi quando si effettua una chiamata jQuery AJAX utilizzando jsonp quando jsonp non è necessario. Provare a cambiare il tipo di dati sul vostro chiamata AJAX, se questo è il caso di normale json

$.ajax({ 
    dataType: 'json', // try using json rather than json p 
    ... 
}); 
0

Ho appena realizzato che durante il caricamento del JSON tramite require e il nome del file non finisce sul .json ottengo questo errore. Rinominare il file in bla.json e funziona correttamente.