使用JSON.parse reviver来混淆字段

时间:2012-05-15 06:39:16

标签: javascript json debugging reviver-function

我试图用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"。

有问题的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;    
  }    
});

2 个答案:

答案 0 :(得分:4)

它有一个相当有趣的行为,整个对象都包含在传递给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。

答案 1 :(得分:4)

通过一些实验,看起来最后调用函数,其中键是一个空字符串,值是顶级对象:

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

但这可能有点偏执;)