带有reviver参数的JSON.parse到白名单对象字段

时间:2017-03-21 20:31:05

标签: javascript json node.js

我正在编写一个Node.js服务器,它需要在其中一个服务中接受字符串化的JSON对象。我还想将JSON对象中的某些字段列入白名单。使用JSON.parse() with the reviver parameter可以完成这两项任务。

出于某种原因,尝试将基于密钥的字段列入白名单为我返回undefined。奇怪的是,我能够成功地将字段列入黑名单,如this jsfiddle中所示。

Example JSON.parse code Example JSON.parse output

任何人都可以解释此行为并修复第一个console.log语句以返回{a="A"}吗?

2 个答案:

答案 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);