如何在javascript中将字符串解析为函数属性

时间:2016-03-10 11:04:15

标签: javascript json serialization deserialization

我创建了自定义stringify方法来将函数字符串化,如下所示

var myStringify=function (obj) {
      return JSON.stringify(obj, function (key, value) {
        if (value instanceof Function || typeof value == 'function') {
          return value.toString();
        }
        return value;
      });
    }

但是当我不知道将字符串函数解析为函数对象时。 这是我的例子

var parsed=JSON.parse(jsonString);

处理完JSON.parse函数后,我得到了以下内容

parsed.run字段包含函数字符串

console.log(parsed.run)  // output is "function(){console.log('foo');}"

我希望这个函数字符串回到已解析对象的属性

{run:"function(){console.log('foo');}"} 

进入

{run:function(){console.log('foo');}}

我该怎么办?

2 个答案:

答案 0 :(得分:1)

先获取身体

var string = parsed.run;
var body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));

现在创建一个新的函数对象并执行

new Function(body)();

您可以在浏览器控制台上尝试使用简单的演示

var string = "function(){console.log('foo');}";
var body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));
new Function(body)(); //outputs foo

将其重构为函数

function convertBodyToFunction(body)
{
   body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));
   return new Function(body);
}
convertBodyToFunction(parsed.run)();

答案 1 :(得分:1)

匹配函数字符串的正则表达式:

var parseFunctionString = /^\s*function(\s+[a-z0-9$_]*)?\(([^)]*)\)\s*\{([\s\S]*)\}\s*$/i;
//extended regExp, to handle fat-arrow-notation
//var parseFunctionString = /^\s*(?:function(\s+[a-z0-9$_]*)?\(([^)]*)\)\s*\{([\s\S]*)\}|\(([^)]*)\)\s*=>([\s\S]*)|([a-z0-9$_]+)\s*=>([\s\S]*))\s*$/i;

和用法:

JSON.parse(input, function(k,v){
    var m = typeof v === "string" && v.match(parseFunctionString);
    if(m){
        return Function(m[2], m[3]);
        //if you include the extended regExp
        //return Function(m[2] || m[4] || m[6], m[3] || "return "+( m[5] || m[7] ));

        //return Function("return " + m[0])();
    }
    return v;
})