如何在javascript中将字符串解析为函数属性
我创建了自定义stringify方法来stringify函数,如下所示如何在javascript中将字符串解析为函数属性,javascript,json,serialization,deserialization,Javascript,Json,Serialization,Deserialization,我创建了自定义stringify方法来stringify函数,如下所示 var myStringify=function (obj) { return JSON.stringify(obj, function (key, value) { if (value instanceof Function || typeof value == 'function') { return value.toString(); }
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');}"}
进入
我该怎么办?先拿到尸体
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)();
匹配函数字符串的正则表达式:
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;
})
“function(){console.log('foo');}”
不是有效的JSON..@RayonDabre,我知道你的意思。我发布的简短说明是:complete is parsed={run:“function(){console.log('foo');}”}。谢谢,为什么会出现这种情况?您想要实现什么?您是否尝试过eval()
?我想向webworker传递一些对象,并想在webworker内部运行对象函数。若我可以将函数字符串转换回函数,我就可以从webworker运行对象函数。
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;
})