簡體   English   中英

帶有reviver參數的JSON.parse將對象字段列入白名單

[英]JSON.parse with reviver parameter to whitelist object fields

我正在編寫一個Node.js服務器,該服務器需要在其服務之一中接受字符串化的JSON對象。 我還想將JSON對象中的某些字段列入白名單。 這兩個任務都應該可以通過使用帶有reviver參數的JSON.parse()來完成。

出於某種原因,嘗試根據鍵將字段列入白名單對我來說undefined 奇怪的是,我能夠成功將字段列入黑名單,如本jsfiddle所示

JSON.parse示例代碼 JSON.parse輸出示例

誰能解釋這種現象並修復第一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM