如何在Javascript中将JSON字符串转换为函数?

时间:2010-12-14 18:26:55

标签: javascript jquery json

如何将javascript / jquery中的字符串转换为函数?

我正在尝试使用JSON参数列表来初始化函数。但是,其中一个参数是一个函数,我将其存储为字符串,当我尝试使用eval()返回函数时出现错误。

例如,如果我的JSON是:

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

然后在我的代码中:

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

6 个答案:

答案 0 :(得分:7)

示例: 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"

您需要在不支持它的浏览器中加载JSON库。

或者做两次不同的辩解:

示例: 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' );

我认为你已经意识到了eval的危险。

答案 1 :(得分:1)

使用此:

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

在字符串的开头和结尾添加括号可以防止语法错误。

但是,请注意,您正在使用eval解析JSON(在某些情况下会有安全风险,但我认为这是无关紧要的,因为您确实希望运行服务器发送的任意代码)。如果你有服务器端的灵活性(发送无效的JSON),你可以发送函数而不是作为字符串引用,而eval应该能够解析那个就好了。

答案 2 :(得分:0)

寻找不使用eval 的方法,这是我能想到的最好方法。使用Function构造函数从function创建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

答案 3 :(得分:0)

this SO question。如前所述,JSON旨在保存数据。要将一段数据视为一个函数,首先需要评估该字符串。

答案 4 :(得分:0)

你正在评估一个匿名函数,当然不会被任何东西调用。如果你真的想在json中运行代码,那么文本需要是alert(e)

然而,这听起来并不是一件非常明智的事情。你最好编写代码来处理json对象的内容,而不是试图运行嵌入在json中的代码。

答案 5 :(得分:0)

两种方式都不是特别好,但是如果你可以摆脱函数(e)包装器位,那么你可以使用var myDynamicFunction = new Function("e", "alert(e);");否则,你正在使用eval()Eval()一般是邪恶的。如果这是JSON,您正在通过$.getJSON来电回复,那么您将面临安全问题。