2010-12-14 17 views
7

¿Cómo puedo convertir una cadena en javascript/jquery a una función?¿Cómo convierto una cadena JSON a una función en javascript?

Estoy tratando de usar una lista de parámetros JSON para inicializar una función. Sin embargo, uno de los parámetros es una función, que almaceno como una cadena, y obtengo un error cuando trato de usar eval() para devolver la función.

Por ejemplo, si mi JSON es:

json = { "one": 700, "two": "function(e){alert(e);}" } 

Luego, en mi código:

parameters = eval(json); 
$('myDiv').addThisFeature({ 
parameter_1: json.one, 
parameter_2: eval(json.two) // <= generates error 
}) 
+0

Gracias - Sé que JSON es solo de datos ... Estoy tratando de inicializar el objeto jqGrid con una lista de parámetros cambiantes, y ocasionalmente uso un parámetro toma una función ... y en este caso, como la función tiene datos internos cambiantes, es más fácil generarlo y enviarlo como una cadena, luego definirlo en mi biblioteca e inicializarlo por separado. –

Respuesta

7

Ejemplo:http://jsfiddle.net/patrick_dw/vs83H/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
var parameters = JSON.parse(json); 
eval('var func = ' + parameters.two); 
func('test'); // alerts "test" 

que necesitará para cargar la biblioteca JSON en los navegadores que no soportan.

O hacer dos evals separadas:

Ejemplo:http://jsfiddle.net/patrick_dw/vs83H/1/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
eval('var parameters = ' + json); 
eval('var func = ' + parameters.two); 
func('test'); 

Asumo que está consciente de los peligros de eval.

+0

Gracias - funciona muy bien. Devuelvo el json de $(). GetJSON() de jquery, que lo analiza sin eval. –

+0

Gracias - eso funciona genial. He oído a menudo que eval es malvado, pero realmente no sé por qué. JSON.parse() y jquery's $ .parseJson() no parecen evaluar la función, por lo que parece que necesito usar eval(). Sin embargo, si alguien quisiera abusar de esto, tendrían que conocer el parámetro específico, ya que jquery devuelve un objeto analizado de una llamada $ .getJSON(). –

+0

@ Adam: Si sabes que tienes control absoluto sobre el contenido que se evade, estás bien. Es solo que ejecuta cualquier representación de cadena de javascript que le dé, por lo que si hay alguna posibilidad de que alguien pueda pasar algún código malicioso, entonces no debería usarse. – user113716

0

Buscando una manera de no utilizar eval esto es lo mejor que podía llegar a . Utilice el constructor de funciones para crear un function desde un string.

var parsed = JSON.parse('{"one":"700", "two":"function(){return 0;}" }'); 
var func = new Function('return ' + parsed.two)(); // return parsed.two function 
alert(typeof func); // function 
alert(func()) // 0 
+0

Creo que desea eliminar el comentario :) – Phrogz

+0

El objeto JSON no existe en todos los navegadores. IE7 o anterior no lo tiene – mkoryak

0

Ver this SO question. Como se dijo, JSON está destinado a contener datos. Para tratar una parte de los datos como una función, primero debe evaluar la cadena.

0

Estás evaluando una función anónima, que por supuesto no será invocada por nada. Si realmente desea ejecutar el código en json, entonces el texto debería ser alert(e).

Sin embargo, no parece una cosa muy sensata. Sería mejor que escribieras código para tratar con el contenido del objeto json, en lugar de intentar ejecutar el código incrustado en el json.

0

Ninguno de los dos es particularmente bueno, pero si puede deshacerse de los bits de envoltura de la función (e), puede usar var myDynamicFunction = new Function("e", "alert(e);");. De lo contrario, está utilizando eval(). Eval() es malvado en general. Si se trata de JSON que está recibiendo de una llamada $.getJSON o algo así, se está abriendo a preocupaciones de seguridad.

1

Utilice esta:

parameters = eval('(' + json + ')'); 
$('#myDiv').addThisFeature({ 
parameter_1: parameters.one, 
parameter_2: eval('(' + parameters.two + ')') // <= does not generate an error 
}); 

Adición de los paréntesis al principio y al final de la cadena evita el error de sintaxis.

Tenga en cuenta, sin embargo, que está analizando JSON utilizando eval (que en algunos casos tiene riesgos de seguridad, pero supongo que es irrelevante porque desea ejecutar código arbitrario enviado por el servidor).Si tiene la flexibilidad del lado del servidor (para enviar JSON no válido), puede simplemente enviar la función no citada como una cadena y eval debería ser capaz de analizar eso muy bien.

+0

Gracias, acabo de ver esto ... es mucho más limpio que definir una variable separada para la función. –

Cuestiones relacionadas