[英]Using a JSON.parse reviver to obfuscate fields
我試圖用JSON.parse濫用reviver函數。
我基本上想讓某些字段為“null”。
如果我這樣做:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return value;
} else {
return null;
}
});
整個json_data對象最終為null。 事實上,無論我做了什么,都定義了json_object的值。
有趣的是,這可以按預期工作:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return "name";
} else {
return value;
}
});
屬性“name”現在具有值“name”。
有問題的JSON:
var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';
更新
我剛剛意識到我想要做的事情的反面也是如此,所以我可以取消名稱字段:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name") {
return null;
} else {
return value;
}
});
它有一個相當有趣的行為,整個對象包含在傳遞給reviver的對象中。
傳遞整個對象時,鍵為空。
var j = '{"uuid":"62cfb2ec-9e43-11e1-abf2-70cd60fffe0e","count":1,"name":"Marvin","date":"2012-05-13T14:06:45+10:00"}';
var json_data = JSON.parse(j, function(k, v) {
if (k === "" || k == "name") {
return v;
} else {
return null;
}
});
console.log(json_data);
根據https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parse
最終使用空字符串和最高值調用reviver,以允許轉換最頂層的值。 一定要正確處理這種情況,通常是返回提供的值,否則JSON.parse將返回undefined。
通過一些實驗,看起來最終調用函數,其中鍵是一個空字符串,值是頂級對象:
> JSON.parse('{"hello": "world"}', function(k, v) { console.log(arguments); return v; })
["hello", "world"]
["", Object]
所以你可以使用:
var json_data = JSON.parse(j, function(key, value) {
if (key == "name" || key === "") {
return value;
} else {
return null;
}
});
現在,由於""
似乎確實是一個有效的JSON密鑰,為了100%正確,最好使用類似的東西:
var json_data;
JSON.parse(j, function(key, value) {
if (key == "name") {
return value;
} else if (key === "") {
json_data = value;
return null;
} else {
return null;
}
});
但那可能有點偏執;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.