-1

如何转换包含 JS 函数定义的 JSON

{  
    "a1": "5",  
    "b1": "10",  
    "c1": "function(param1,param2) { return param1 +param2}"  
}

到包含这些函数的 JavaScript 对象(而不是带有定义的字符串):

{  
    a1: 5,  
    b1: 10,  
    c1: function(param1,param2) { return param1 + param2}  
}
4

4 回答 4

2

您可以将reviver 函数传递给JSON.parse. 这使您可以将自定义逻辑应用于解析的值。

在此函数中,您可以测试值是否以模式开头function(...) {

var obj = JSON.parse(str, function(k, v) {

    if (/^\s*function\s*\([^)]*\)\s*{/.test(v)) {
        try {
            // using the Function constructor to evaluate the function
            // definition in global scope
            return Function('return ' + v)();
        }
        catch() {
            return v; // maybe not a JS function definition after all
        }
    }
    return v;
});

演示

当然,您也可以只遍历生成的对象并在解析后应用相同的逻辑,但如果您有嵌套的对象/数组,使用 reviver 函数会更容易。

请注意,这是一个非常简单的测试,仅适用于匿名函数。如果您已命名函数,则必须相应地调整表达式。但这是基本思想。

于 2013-08-26T13:21:11.970 回答
0

使用 JS 函数JSON.parse

var myobj = JSON.parse("{\"a1\": \"5\",  \"b1\": \"10\",  \"c1\": \"function(param1,param2) { return param1 +param2}\"  }");
于 2013-08-26T13:16:34.617 回答
0

两步:解析json,将函数源码提升为函数:

var jsonObj = JSON.parse(jsonFromAjax);
jsonObj.c1 = eval(jsonObj.c1);
于 2013-08-26T13:16:56.827 回答
-1

这是一个将包含函数的 json 字符串转换回具有有效函数声明的 json 对象的示例。

var jsonstring = "{\"schema\": {\"title\": \"用户反馈\", \"description\":\"so\", \"type\":\"object\", \ "properties\":{\"name\":{\"type\":\"string\"}}}," + "\"options\":{ \"form\":{\"attributes\" :{}, \"buttons\":{ \"submit\":{ \"title\":\"It\", \"click\":\"function(){alert('hello');} \" }}} }}";

var jsonData = JSON.parse(jsonstring);

function Iterate(data)
{
      jQuery.each(data, function (index, value) {
        if (typeof value == 'object') {
            Iterate(value);
        }
        else {
            if (value.indexOf("function()") > -1)
                data[index] = eval("(" + value + ")");
        }
    });

};

Iterate(jsonData);

在这种情况下 jsonData.options.form.buttons.submit.click();

于 2015-11-22T13:36:15.933 回答