2011-11-02 11 views
12

Próbowałem tego prostego kodu JavaScript:eval() = Nieoczekiwany token: Błąd

eval('{"Topics":["toto","tata","titi"]}') 

W konsoli Chrome, na przykład, to zwraca

SyntaxError: Unexpected token :

Próbowałem JSON na JSONLint i to ważny.

Czy widzisz błąd?

Odpowiedz

8

FWIW, zamiast tego użyj JSON.parse. Bezpieczniejszy niż eval.

8

Numer jeden: nie używaj eval.

Numer dwa. Używaj tylko eval, aby coś zrobić, dobrze się oceniaj. Na przykład:

eval('var topics = {"Topics":["toto","tata","titi"]}'); 
4

Ponieważ to jest ocena obiektu. eval() wymaga, abyś przekazał składniowo poprawny javascript, a wszystko, co robisz, przechodzi w gołym obiekcie. Wezwanie powinno być więcej takich jak:

eval('var x = {"Topics":etc...}'); 
26

Ponieważ evalnie siły kontekście wyrażenie a łańcuch warunkiem jest nieważny Program JavaScript, zatem pierwsze trzy żetony (i jak one wyglądały w) są :

{   // <-- beginning of a block, and NOT an Object literal 
"Topics"  // <-- string value, okay (note this is NOT a label) 
:   // <-- huh? expecting ";" or "}" or an operator, etc. 

Szczęśliwe kodowanie.

+0

mogę zapytać, dlaczego eval ('function() {}') zgłasza wyjątek zbyt? – BiAiB

+4

@BiAiB Z tego samego powodu co powyżej :) Zawartość 'eval' działa w kontekście * statement * i dlatego jest traktowana jako konstrukcja gramatyczna FunctionDeclaration. Błąd generowany przez to polecenie "SyntaxError: function statement wymaga nazwy". Podaj mu nazwę ('eval ('function f() {}'); f()') lub zmuś ją do konstruktu FunctionExpression ('f = eval ('(function() {alert (" hi ")}) "); f()'). Zobacz http://es5.github.com/x13.html –

+0

dzięki! Najtrudniejsze było dla mnie to, że łańcuchy takie jak "3" są poprawnie ocenione, a nie "function() {}". Drugiego nie można ocenić jako wyrażenia ExpressionStatement: 'wyrażenie ExpressionStatement nie może zaczynać się od słowa kluczowego function, ponieważ może to być niejednoznaczne z funkcją FunctionDeclaration' (http://es5.github.com/x12.html#x12.4) – BiAiB

4

USE:

function evalJson(jsArray){ eval("function x(){ return "+ jsArray +"; }"); return x(); } 

var yourJson =evalJson('{"Topics":["toto","tata","titi"]}'); 

console.log(yourJson.Topics[1]); // print 'tata'' 
+0

. nie wiem, czy to najlepsza praktyka, ale to mnie poprawiło i zadziałało – Patrick

+0

głosowało za prostotą – bresleveloper

26

Trzeba napisać jak to

eval('('+stingJson+')'); 

przekonwertować ciąg do obiektu

nadzieję, że pomoże!

+2

To było jedyne rozwiązanie, które działało w moim przypadku. Dziękuję Ci! –

+1

thx, to znacznie lepiej niż zaakceptowana odpowiedź. Dobrze jest zaznaczyć, że eval jest zły :), ale mimo to odpowiada na pytanie. – apocalypz

+0

Doskonała! Bingo! –

0

jeśli używasz JQuery używać funkcji $.parseJSON(), pracował dla mnie, miałem ten sam problem