执行:
function myFunction() {
var hash = JSON.parse('{"a":"return num"}', function(k, v){ new Function('num', v)(123) });
}
我想得到hashmap: {A = 123}
但是,Google Apps脚本说:
在元素列表之后SyntaxError:missing]
我知道下面的代码效果很好,但我希望JSON的值包含“return”。
function myFunction() {
var num = 123;
var hash = JSON.parse('{"a": "num"}', function(k, v){return eval(v)});
}
答案 0 :(得分:2)
对于输入中找到的每个项目,reviver函数运行一次。在这个JSON字符串的情况下:
{"a":"return num"}
它将运行两次(!)。首先是内部键值对"a":"return num"
,然后是根对象本身(键值对"": {"a":"return num"}
)。
您只想在密钥为"a"
时执行某些操作,在所有其他情况下,您希望保持该值不变。
var json = '{"a":"return num"}';
var revived = JSON.parse(json, function (k, v) {
if (k === "a") {
return (new Function('num', v))(123);
} else {
return v;
}
});
console.log(revived);

小心,这样做很危险。 new Function
与eval()
实际上是一样的,所以我建议你认真思考如何做更好的方法。
如何使用配置对象和特殊语法约定将数据中的某些值替换为配置中的值:
var config = {
num: 123
};
var json = '{"a":"{{num}}"}';
var revived = JSON.parse(json, function (k, v) {
var match = typeof v === "string" && v.match(/^{{(\w+)}}$/);
if (match && config.hasOwnProperty(match[1])) {
return config[match[1]];
} else {
return v;
}
});
console.log(revived);