【问题标题】:How do I convert a JSON string to a function in javascript?如何将 JSON 字符串转换为 javascript 中的函数?
【发布时间】:2010-12-14 18:26:55
【问题描述】:

如何将 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
})

【问题讨论】:

  • 谢谢 - 我知道 JSON 是纯数据的......我正在尝试用一个不断变化的参数列表来初始化 jqGrid 对象,我偶尔会使用一个参数来获取一个函数......而在这个这种情况下,由于函数本身具有不断变化的内部数据,因此更容易生成它并将其作为字符串发送,然后在我的库中定义它并单独初始化它。

标签: javascript jquery json


【解决方案1】:

示例: 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 的危险。

【讨论】:

  • 谢谢 - 效果很好。我从 jquery 的 $().getJSON() 中得到了 json,它在没有 eval 的情况下解析它。
  • 谢谢 - 效果很好。我经常听说 eval 是邪恶的——但我真的不知道为什么。 JSON.parse() 和 jquery 的 $.parseJson() 似乎没有评估函数 - 所以看起来我需要使用 eval()。但是,如果有人想滥用这个,他们必须知道具体的参数,因为 jquery 从 $.getJSON() 调用返回一个解析的对象。
  • @Adam:如果你知道你对被评估的内容有绝对的控制权,那你很好。只是它执行你给它的任何 javascript 字符串表示,所以如果有人可能传递一些恶意代码,那么它不应该被使用。
【解决方案2】:

寻找一种不使用eval的方法,这是我能想到的最好方法。使用 Function 构造函数从 string 创建一个 function

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

【讨论】:

  • 我想你想删除评论:)
  • JSON 对象并不存在于所有浏览器中。 IE7或更早版本没有
【解决方案3】:

使用这个:

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

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

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

【讨论】:

  • 谢谢 - 刚刚看到这个......这比为函数定义单独的变量要干净得多。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      这两种方法都不是特别好,但是如果您可以摆脱 function(e) 包装位,那么您可以使用var myDynamicFunction = new Function("e", "alert(e);"); 否则,您正在考虑使用eval()Eval() 通常是邪恶的。如果这是您从$.getJSON 电话或其他什么返回的 JSON,那么您将面临安全问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-16
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多