我正在编写一个Node.js服务器,它需要在其中一个服务中接受字符串化的JSON对象。我还想将JSON对象中的某些字段列入白名单。使用JSON.parse() with the reviver parameter可以完成这两项任务。
出于某种原因,尝试将基于密钥的字段列入白名单为我返回undefined
。奇怪的是,我能够成功地将字段列入黑名单,如this jsfiddle中所示。
任何人都可以解释此行为并修复第一个console.log
语句以返回{a="A"}
吗?
答案 0 :(得分:2)
为JSON对象的每个属性调用reviver回调,包括嵌套属性,最后为对象本身调用。因此,reviver回调的最后一次调用将获得key = ''
和value = [the JSON object]
作为参数。 ''
不等于'a'
,因此当最后一次为整个对象调用时,您的reviver回调将返回undefined。这就是为什么你看到未定义的"白名单"方法
在嵌套对象上使用方法时会出现另一个问题:
var test = "{\"a\": { \"a\": \"A\", \"d\": \"D\" }, \"b\": \"B\", \"c\": \"C\"}";
console.log(JSON.parse(test, function(key, val){ if (key === "a" || key === "") return val; }));
// { a: { a: 'A' } } <-- property d is missing
你可以,例如使用lodash's _.pick
或JSON模式验证程序(如ajv)将属性列入白名单。或者您可以简单地删除不需要的属性:
var whitelist = ['a'];
for (var prop in jsonObject) {
if (!jsonObject.hasOwnProperty(prop)) continue;
if (whitelist.indexOf(prop) === -1) delete jsonObject[prop];
}
答案 1 :(得分:2)
最后一次调用reviver 3次+ 1次,键为空,表示该对象已被解析。
var test = "{\"a\": \"A\", \"b\": \"B\", \"c\": \"C\"}";
var res = JSON.parse(test,function(key, val){
console.log(key,key=="");
if (key === "b" ) {
return val;
} else if (key==""){
return val;
}});
console.log(res);