隐藏JSON.stringify()的输出中的某些值

是否有可能排除某些字段被包含在jsonstring中?

这里是一些伪代码

var x = { x:0, y:0, divID:"xyz", privateProperty1: 'foo', privateProperty2: 'bar' } 

我想排除privateProperty1和privateproperty2出现在jsonstring中

所以我想,我可以使用stringify替代function

 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 } 

我想在没有privateproperties的string中。

Mozilla文档说返回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 (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']))); 

编辑 – 我改变了底部function的function键,以防止混淆。

你可以使用Object的本地函数defineProperty

 var data = {a: 10}; Object.defineProperty(data, 'transient', {value: 'static', writable: true}); data.transient = 'dasda'; console.log(JSON.stringify(data)); //{"a":10} 

另一个好的解决scheme:(需要下划线)

 x.toJSON = function () { return _.omit(this, [ "privateProperty1", "privateProperty2" ]); }; 

这个解决scheme的好处是任何在x上调用JSON.stringify的人都会得到正确的结果 – 您不必单独修改JSON.stringify调用。

非下划线版本:

 x.toJSON = function () { var result = {}; for (var x in this) { if (x !== "privateProperty1" && x !== "privateProperty2") { result[x] = this[x]; } } return result; }; 

更简单的方法。

  1. 创build一个variables并分配一个空数组。 这使得对象成为数组的原型。
  2. 在此对象上添加非数字键。
  3. 使用JSON.stringify序列化此对象
  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

Object.create是接近defineProperty解决scheme的另一个解决scheme(属性以相同的方式定义),但以这种方式定义要从头开始公开的属性。 通过这种方式,只需将属性enumerable值设置为true即可(仅默认为false),JSON.stringify将忽略不可枚举的属性,缺点是在使用for-在对象或函数(如Object.keys)中循环。

 var x = Object.create(null, { x: {value:0, enumerable: true}, y:{value: 0, enumerable: true}, divID: {value: 'xyz', enumerable: true}, privateProperty1: {value: 'foo'}, privateProperty2: {value: 'bar'} }); JSON.stringify(x) //"{"x":0,"y":0,"divID":"xyz"}" 

注意Miroslaw Dylag的答案 :确定的财产应该是自己的财产。 否则会失败。

不起作用:

 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 

即使没有任何物体,也可以玩这个概念。