使用JSON.parse齐磊混淆场(Using a JSON.parse reviver to ob

2019-07-29 09:14发布

我试图滥用齐磊函数JSON.parse。

基本上,我想使某些领域的“空”。

如果我这样做:

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

在“名称”属性现在有“名”的值。

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

Answer 1:

通过一些实验,它看起来像一个最终调用到这里的关键是一个空字符串和值是顶层对象的功能提出:

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

但是,这可能是一个有点偏执;)



Answer 2:

它有整个对象包括在传递到齐磊对象一个颇为有趣的现象。

当整个对象传递,该键为null。

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

该齐磊最终与空字符串和顶端的值称为允许的最顶层价值的转变。 一定要将通常通过返回提供的值正确处理这种情况下,或JSON.parse会返回undefined。



文章来源: Using a JSON.parse reviver to obfuscate fields