2012-05-15 1 views
4

Я пытаюсь использовать функцию reviver с помощью JSON.parse.Использование JSON.parse reviver для обфускации полей

В основном я хочу, чтобы определенные поля «null».

Если я это сделать:

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

Весь объект json_data заканчивается нуль. Фактически, независимо от того, что я делаю else, это определяет значение 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"}'; 

Update

Я просто понял, что обратное, что я хочу делать дела, а поэтому я могу обнулить поле Имя:

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

Вы можете также разместить JSON? – jmort253

+0

Также, что вы видите, если вы console.log - или alert - значение в функции reviver? Я проверил [API] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/parse), и пока ваш код выглядит хорошо ... – jmort253

+1

+1 Интересный вопрос – jmort253

ответ

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

Но это может быть немного параноиком;)

+0

Жаль об этом! Случайно отредактировал неправильный ответ. – Corbin

+0

Darn ... Мне это нравится. Это заставило его выглядеть так, как если бы я цитировал источники и прочее;) –

+0

@David - Ваш консольный пример действительно помогает! По-моему, я понимаю, что происходит. Один из возвращенных массивов имеет ключ «», поэтому, если он не проверен, если я правильно понял, тогда весь объект станет нулевым? – jmort253

4

У него довольно интересное поведение, что весь объект включен в объекты, переданные редактору.

Когда весь объект передан, ключ имеет значение 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 вернется не определен.

+0

Я не уверен Я понимаю, почему нужен 'k ===" "'? Что это точно? – jmort253

+0

@ jmort253 В качестве последнего вызова функции reviver передается весь объект. Другими словами, json_data передается как последняя вещь функции. В этом случае ключ представляет собой пустую строку. – Corbin

+0

Теперь, лучший вопрос: мне интересно, почему они решили использовать пустую строку (которая является действительным ключом JSON) вместо значения вроде, скажем, 'undefined', который не является допустимым ключом (и вроде бы сделал бы смысл). –

 Смежные вопросы

  • Нет связанных вопросов^_^