4

我正在尝试使用 JSON.parse 滥用 reviver 函数。

我基本上想让某些字段为“null”。

如果我这样做:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return value;
  } else {
    return null;    
  }    
});

整个 json_data 对象最终为空。事实上,不管我做什么,它定义了 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"}';

更新

我刚刚意识到与我想做的相反的事情也有效,所以我可以取消 name 字段:

var json_data = JSON.parse(j, function(key, value) {
  if (key == "name") {        
    return null;
  } else {
    return value;    
  }    
});
4

2 回答 2

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。

于 2012-05-15T06:51:49.257 回答
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;    
  }    
});

但这可能有点偏执;)

于 2012-05-15T06:52:44.670 回答