[英]JSON.parse with reviver parameter to whitelist object fields
我正在編寫一個Node.js服務器,該服務器需要在其服務之一中接受字符串化的JSON對象。 我還想將JSON對象中的某些字段列入白名單。 這兩個任務都應該可以通過使用帶有reviver參數的JSON.parse()來完成。
出於某種原因,嘗試根據鍵將字段列入白名單對我來說undefined
。 奇怪的是,我能夠成功將字段列入黑名單,如本jsfiddle所示 。
誰能解釋這種現象並修復第一個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.