运行json字符串函数

时间:2010-10-21 21:41:59

标签: javascript json

我有一个像这样的json字符串:

json = "{'run': 'function() { console.log('running...'); }'}"

如何在json字符串中运行该函数?

6 个答案:

答案 0 :(得分:7)

您将不得不使用eval()doc)功能。很多人对这个功能有很多感受。 JSON最适合传输数据,而不是函数(参见JSON)。功能应该放在页面上的脚本中。 您发布的代码中也存在语法错误(函数包含在单引号(')中,console.log的第一个参数也是如此)。 但...

json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks
obj = JSON.parse(json);
eval(obj.run); //Logs "running..."

<强>更新

哦,我错了。 Eval似乎不喜欢匿名函数。使用修改后的代码,它会将json解析为具有String的run属性的对象,其值为"function() { console.log('running...'); }"。但是当你eval(obj.run);时,你会得到一个声明意外的SyntaxError(推测,这是(在函数)中。

所以,我可以想到两种方法来解决这个问题:

  1. 删除实际JSON字符串中的匿名函数(因此,让PHP忘记function () {),然后评估它。这意味着只要您eval它就会被调用。
  2. 我认为您想要的是能够将其评估为匿名函数,该函数将在您需要时调用。所以,你可以写一个包装函数(你也需要遵循选项1):

    function returnEval(str) {
        return function () { eval(str); }
    }
    

    这可以让你调用它。所以:

    obj = JSON.parse(json);
    obj.run = returnEval(obj.run);
    obj.run(); //Logs "running..."
    
  3. 希望这有帮助!

答案 1 :(得分:0)

JSON并非真正用于此目的,但here似乎是一个很好的例子。

答案 2 :(得分:0)

这适用于我的Firefox:

var json = "{'run': 'function() { console.log(\\'running...\\'); }'}";
eval('var j = ' + json);
eval('var r = ' + j.run);
r();

答案 3 :(得分:0)

试试这个,它有效:

var JS = { "function" : "alert( new Date().getTime() );" };

new Function ( "", JS["function"] )();

对于嵌套函数,您也可以使用以下内容:

jQuery.each( JS, function( method, value ) {
        new Function ( "a, b", "if ( a == 'function' ) { new Function ( '', b )(); }" )( method, value );
} );

答案 4 :(得分:0)

我知道线程已经老了,但我想与你们分享。您可以将字符串设为json并使用这些函数轻松解析它。

function makeString(val){
    return JSON.stringify(val, function (key, value) {if (typeof value == 'function') {return value.toString();}return value;});
}

function parseIt(val){
    return JSON.parse(string, function (key, value) {if (value.toString().search("function")>-1) {eval("var func = " + value);return func;}return value;});
}

答案 5 :(得分:0)

不使用send_text = function(message){ system(paste('osascript -e \'tell application "Messages"\' -e \'send "', message, '" to buddy "555-555-5555" of (service 1 whose service type is iMessage)\' -e \'end tell\'')) } ,您可以使用eval('function()')创建新功能。以下代码使用FF,Chrome,IE进行了测试。

new Function(strName)