JSON.parse和reviver参数白名单对象字段
我正在写一个Node.js服务器,它需要在其服务之一中接受string化的JSON对象。 我也想将JSON对象中的某些字段列入白名单。 这两个任务都应该使用带有reviver参数的JSON.parse()来实现。
出于某种原因,尝试将基于密钥的字段列入白名单返回undefined
给我。 奇怪的是,我能够成功地将字段黑名单,正如在这个jsfiddle中看到的。
任何人都可以解释这种行为,并修复第一个console.log
语句返回{a="A"}
?
Revivercallback函数为JSON对象的每个属性调用,包括嵌套属性,最后是对象本身。 所以revivercallback的最后一个调用将获得key = ''
和value = [the JSON object]
作为参数。 ''
不等于'a'
,所以当最后一次调用整个对象时,你的revivercallback函数返回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模式validation程序(如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最后一次,键为空,表示对象已被parsing。
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);
- JSON / Nodejs / swagger:在swagger中显示的快速响应string中没有翻译成多行的换行符
- 从节点中的JSON文件中删除字段
- 用Mochatestingjavascript – 我如何使用console.log来debuggingtesting?
- 从JavaScript中提取EXIF数据的GPS数据
- 获取json数据时出错,ajax
- 仅当另一个具有特定值时,才需要Node Js Express Validator字段
- 如何推迟承诺,直到async.each完成?
- 如何在启动funcC()之前执行未定义数目的funcA()和funcB()?
- 为什么下面的JavaScript正则expression式不能工作?