我试图用JSON.parse滥用reviver函数。
我基本上想要制作某些字段" null"。
如果我这样做:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return value;
} else {
return null;
}
});
整个json_data对象最终为null。事实上,无论我做了什么,都定义了json_object的值。
有趣的是,这可以按预期工作:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return "name";
} else {
return value;
}
});
该物业"名称"现在的值为" name"。
有问题的JSON:
var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';
更新
我刚刚意识到我想要做的事情的反面也有效,所以我可以取消名称字段:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return null;
} else {
return value;
}
});
答案 0 :(得分:4)
它有一个相当有趣的行为,整个对象都包含在传递给reviver的对象中。
传递整个对象时,键为空。
var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';
var json_data = JSON.parse(j, function(k, v) {
if (k === "" || k == "name") {
return v;
} else {
return null;
}
});
console.log(json_data);
根据https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parse
最终使用空字符串和最高值调用reviver,以允许转换最顶层的值。一定要正确处理这种情况,通常是返回提供的值,否则JSON.parse将返回undefined。
答案 1 :(得分:4)
通过一些实验,看起来最后调用函数,其中键是一个空字符串,值是顶级对象:
> JSON.parse('{"hello": "world"}', function(k, v) { console.log(arguments); return v; })
["hello", "world"]
["", Object]
所以你可以使用:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name" || key === "") {
return value;
} else {
return null;
}
});
现在,由于""
似乎确实是一个有效的JSON密钥,为了100%正确,最好使用以下内容:
var json_data;
JSON.parse(j, function(key, value) {
if (key == "name") {
return value;
} else if (key === "") {
json_data = value;
return null;
} else {
return null;
}
});
但这可能有点偏执;)