【问题标题】:JSON.parse with reviver parameter to whitelist object fieldsJSON.parse 带有 reviver 参数以将对象字段列入白名单
【发布时间】:2017-03-22 04:56:07
【问题描述】:

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

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

谁能解释这种行为并修复第一个console.log 语句以返回{a="A"}

【问题讨论】:

标签: javascript json node.js


【解决方案1】:

为 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 或像ajv 这样的JSON 模式验证器将属性列入白名单。或者您可以简单地删除不需要的属性:

var whitelist = ['a'];
for (var prop in jsonObject) {
    if (!jsonObject.hasOwnProperty(prop)) continue;
    if (whitelist.indexOf(prop) === -1) delete jsonObject[prop];
}

【讨论】:

  • 键不一定是未定义的。它对我来说是一个空字符串(chrome)。
【解决方案2】:

reviver 被调用 3 次 + 1 最后一次,key 为空表示对象已被解析。

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

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2017-10-05
    • 1970-01-01
    • 2010-12-20
    • 2016-09-17
    相关资源
    最近更新 更多