Скрыть определенные значения в выводе из 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 68

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}

простой способ сделать.

  1. создать переменную и присвоить пустой массив. Это делает объект прототипом массива.
  2. добавить нечисловые клавиши на этот объект.
  3. сериализовать этот объект с помощью JSON.преобразовать в строки
  4. вы увидите, что ничего не сериализуется от этого объекта.

~~~

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 вновь созданной переменной