gpt4 book ai didi

javascript - 将函数序列化和反序列化到 JSON 或从 JSON 反序列化

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:49 24 4
gpt4 key购买 nike

假设您有以下内容:

function myfunc() {
// JS code
}

var args = '{ "strfield": "hello world", "numfield": 10, "funcfield": myfunc }';

问题:在将 args 变量提交给 JSON 解析器之前如何处理它,以便将 myfunc 替换为 myfunc.toString( )(即函数体)?提议的解决方案应该适用于任意函数和此类准 JSON 字符串。

最佳答案

我们使用可选的第二个 replacer JSON.stringify 的参数以预处理键/值,以字符串形式发出函数:

function stringify_with_fns(obj) {
return JSON.stringify(obj, function(key, value) {
return typeof value === "function" ? value.toString() : value;
});
}

然后为了在输出时将字符串化函数变回真实函数,我们使用可选的第二个 reviver JSON.parse 的参数,如

function parse_with_fns(json) {
return JSON.parse(json, function(key, value) {
if (looks_like_a_function_string(value)) {
return make_function_from_string(value);
} else {
return value;
}
});
}

looks_like_a_function_string 只是一个正则表达式,make_function_from_string 处的第一个 cut 可以使用 eval:

function looks_like_a_function_string(value) {
return /^function.*?\(.*?\)\s*\{.*\}$/.test(value);
}
function make_function_from_string(value) {
return eval(value);
}

为了避免eval,我们可以拆开函数字符串来找到它的参数和主体,这样我们就可以将它们传递给new Function:

function make_function_from_string(value) {
var args = value
.replace(/\/\/.*$|\/\*[\s\S]*?\*\//mg, '') //strip comments
.match(/\(.*?\)/m)[0] //find argument list
.replace(/^\(|\)$/, '') //remove parens
.match(/[^\s(),]+/g) || [], //find arguments
body = value.match(/\{(.*)\}/)[1] //extract body between curlies

return Function.apply(0, args.concat(body);
}

测试:

x = parse_with_fns(stringify_with_fns({a: function() {var x=1;}}))
x.a
> function anonymous() {var x=1;}

但是请注意,由于 new Function 创建的函数都在全局范围内,因此它们将失去其封闭范围和闭包。

唯一剩下的问题是这是否有用。我想它可能用于小型实用程序功能。

将概念扩展到序列化/反序列化正则表达式或日期对象留作练习。

关于javascript - 将函数序列化和反序列化到 JSON 或从 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4293769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com