[英]JSON.parse with reviver parameter to whitelist object fields
我正在编写一个Node.js服务器,该服务器需要在其服务之一中接受字符串化的JSON对象。 我还想将JSON对象中的某些字段列入白名单。 这两个任务都应该可以通过使用带有reviver参数的JSON.parse()来完成。
出于某种原因,尝试根据键将字段列入白名单对我来说undefined
。 奇怪的是,我能够成功将字段列入黑名单,如本jsfiddle所示 。
谁能解释这种现象并修复第一个console.log
语句以返回{a="A"}
?
对JSON对象的每个属性(包括嵌套属性),最后对对象本身,都调用reviver回调。 因此,reviver回调的最后一次调用将获得key = ''
和value = [the JSON object]
作为参数。 ''
不等于'a'
,因此您的齐磊回调在最后一次为整个对象调用时返回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的_.pick
或JSON模式验证像ajv到白名单中的性能。 或者,您可以简单地删除不需要的属性:
var whitelist = ['a'];
for (var prop in jsonObject) {
if (!jsonObject.hasOwnProperty(prop)) continue;
if (whitelist.indexOf(prop) === -1) delete jsonObject[prop];
}
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.