2011-11-02 14 views
12

Probé este simple código JavaScript:Eval() = símbolo inesperado: Error

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

En la consola de Chrome, por ejemplo, este devuelve

SyntaxError: Unexpected token :

probé el JSON en JSONLint y es válido.

¿Ves el error?

Respuesta

8

FWIW, use JSON.parse en su lugar. Más seguro que eval.

8

Número uno: No utilice eval.

Número dos. Solo usa eval para hacer algo, bien evaluado. Como por ejemplo:

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

Porque eso es evaluar un objeto. eval() requiere que ingreses javascript sintácticamente válido, y todo lo que estás haciendo es pasar un objeto simple. La llamada debe ser más como:

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

Debido evalno fuerza de un contexto de expresión y la cadena entregada es un programa JavaScript inválida, por tanto, los primeros tres fichas (y la forma en que se miran) son :

{   // <-- 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. 

Happy coding.

+0

puedo preguntarle por qué eval ('function() {}') emite una excepción también? – BiAiB

+4

@BiAiB Por la misma razón que la anterior :) El contenido de 'eval' se ejecuta en un contexto * statement * y, por lo tanto, se toma como una construcción gramatical FunctionDeclaration. El error generado por eso es "SyntaxError: declaración de función requiere un nombre". O le da un nombre ('eval ('función f() {}'); f()' o lo fuerza a un constructo FunctionExpression ('f = eval ('(function() {alert (" hi ")}) '); f() '). ¡Vea http://es5.github.com/x13.html –

+0

gracias! la parte más difícil para mí fue porque cadenas como '3' se evalúan correctamente y no 'función() {}'. El segundo no se puede evaluar como un ExpressionStatement: 'un ExpressionStatement no puede comenzar con la palabra clave de la función porque eso podría hacer que sea ambiguo con una FunctionDeclaration' (http://es5.github.com/x12.html#x12.4) – BiAiB

4

USO:

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

funciona para yo ... no sé si es la mejor práctica, pero me puso en funcionamiento – Patrick

+0

votó por la simplicidad – bresleveloper

26

Tienes que escribir como esto

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

para convertir una cadena a Objeto

Esperanza ayudo!

+2

Esta fue la única solución que funcionó en mi caso. ¡Gracias! –

+1

thx, esto es mucho mejor que la respuesta aceptada. Es bueno señalar que eval es malo :), pero aún así, esto responde la pregunta. – apocalypz

+0

¡Excelente! ¡Bingo! –

0

si está utilizando jQuery utilizar la función $.parseJSON(), trabajado para mí, tenía el mismo problema

Cuestiones relacionadas