簡體   English   中英

使用JSON.parse reviver來混淆字段

[英]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的對象中。

傳遞整個對象時,鍵為空。

http://jsfiddle.net/sGYGM/7/

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.

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