Скрыть определенные значения в выводе из JSON.преобразовать в строки()
можно ли исключить некоторые поля из включения в строку json?
вот какой-то псевдо код
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
Я хочу исключить privateProperty1 и privateproperty2 из появления в строке json
поэтому я подумал, что могу использовать функцию stringify replacer
function replacer(key,value)
{
if (key=="privateProperty1") then retun "none";
else if (key=="privateProperty2") then retun "none";
else return value;
}
и в stringify
var jsonString = json.stringify(x,replacer);
но в jsonString я все еще вижу его как
{...privateProperty1:value..., privateProperty2:value }
Я хотел бы получить строку без частной собственности в них.
9 ответов:
The Mozilla docs сказать, чтобы вернуть
undefined
вместо"none"
:http://jsfiddle.net/userdude/rZ5Px/
function replacer(key,value) { if (key=="privateProperty1") return undefined; else if (key=="privateProperty2") return undefined; else return value; } var x = { x:0, y:0, divID:"xyz", privateProperty1: 'foo', privateProperty2: 'bar' }; alert(JSON.stringify(x, replacer));
вот метод дублирования, в случае, если вы решите пойти по этому маршруту (в соответствии с вашим комментарием).
http://jsfiddle.net/userdude/644sJ/
function omitKeys(obj, keys) { var dup = {}; for (var key in obj) { if (keys.indexOf(key) == -1) { dup[key] = obj[key]; } } return dup; } var x = { x:0, y:0, divID:"xyz", privateProperty1: 'foo', privateProperty2: 'bar' }; alert(JSON.stringify(omitKeys(x, ['privateProperty1','privateProperty2'])));
EDIT - я изменил функциональную клавишу в нижней функции, чтобы сохранить его от путаницы.
еще одно хорошее решение: (необходимо подчеркнуть)
x.toJSON = function () { return _.omit(this, [ "privateProperty1", "privateProperty2" ]); };
преимущество этого решения заключается в том, что любой, кто вызывает JSON.stringify на x будет иметь правильные результаты - вам не нужно изменять JSON.stringify звонки по отдельности.
версия без подчеркивания:
x.toJSON = function () { var result = {}; for (var x in this) { if (x !== "privateProperty1" && x !== "privateProperty2") { result[x] = this[x]; } } return result; };
вы можете использовать нативную функцию defineProperty объекта:
var data = {a: 10}; Object.defineProperty(data, 'transient', {value: 'static', writable: true}); data.transient = 'dasda'; console.log(JSON.stringify(data)); //{"a":10}
простой способ сделать.
- создать переменную и присвоить пустой массив. Это делает объект прототипом массива.
- добавить нечисловые клавиши на этот объект.
- сериализовать этот объект с помощью JSON.преобразовать в строки
- вы увидите, что ничего не сериализуется от этого объекта.
~~~
var myobject={ a:10, b:[] }; myobject.b.hidden1 = 'hiddenValue1'; myobject.b.hidden2 = 'hiddenValue2'; //output of stringify //{ // "a": 10, // "b": [] //}
~~~
http://www.markandey.com/2015/07/how-to-hide-few-keys-from-being-being.html
Примечание Мирослав Dylag ' s ответ: определенное свойство должно быть его собственным свойством. В противном случае он потерпит неудачу.
не работает:
class Foo { } Object.defineProperty(Foo.prototype, 'bar', { value: 'bar', writable: true }); const foo = new Foo(); foo.bar = 'baz'; alert(JSON.stringify(foo).indexOf('bar') === -1); // false (found)
работает:
class Foo { constructor() { Object.defineProperty(this, 'bar', { value: 'bar', writable: true }); } } const foo = new Foo(); foo.bar = 'baz'; alert(JSON.stringify(foo).indexOf('bar') === -1); // true (not found)
Я знаю, что это уже ответ на вопрос, но я хотел бы добавить что-то при использовании instatiated объектов.
Если вы назначите его с помощью функции, он не будет включен в JSON.stringify() результат.
чтобы получить доступ к значению, вызовите его как функцию, а также, заканчивая
()
var MyClass = function(){ this.visibleProperty1 = "sample1"; this.hiddenProperty1 = function(){ return "sample2" }; } MyClass.prototype.assignAnother = function(){ this.visibleProperty2 = "sample3"; this.visibleProperty3 = "sample4"; this.hiddenProperty2 = function(){ return "sample5" }; } var newObj = new MyClass(); console.log( JSON.stringify(newObj) ); // {"visibleProperty1":"sample1"} newObj.assignAnother(); console.log( JSON.stringify(newObj) ); // {"visibleProperty1":"sample1","visibleProperty2":"sample3","visibleProperty3":"sample4"} console.log( newObj.visibleProperty2 ); // sample3 console.log( newObj.hiddenProperty1() ); // sample2 console.log( newObj.hiddenProperty2() ); // sample5
вы также можете играть вокруг с концепцией, даже если не на instatiated объектов.
abstract class Hideable { public hidden = []; public toJSON() { var result = {}; for (var x in this) { if(x == "hidden") continue; if (this.hidden.indexOf(x) === -1) { result[x] = this[x]; } } return result; }; }
вы можете сделать это легко с es6
let {privateProperty1:exc1, privateProperty2:exc2, ...foo} = { x:0, y:0, divID:"xyz", privateProperty1: 'foo', privateProperty2: 'bar' }
здесь
privateProperty1
иprivateProperty2
назначенаexc1
иexc2
соответственно. Остатки присваиваютсяfoo
вновь созданной переменной