JSON.parse和reviver参数白名单对象字段

我正在写一个Node.js服务器,它需要在其服务之一中接受string化的JSON对象。 我也想将JSON对象中的某些字段列入白名单。 这两个任务都应该使用带有reviver参数的JSON.parse()来实现。

出于某种原因,尝试将基于密钥的字段列入白名单返回undefined给我。 奇怪的是,我能够成功地将字段黑名单,正如在这个jsfiddle中看到的。

示例JSON.parse代码 示例JSON.parse输出

任何人都可以解释这种行为,并修复第一个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);