隐藏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; };
更简单的方法。
- 创build一个variables并分配一个空数组。 这使得对象成为数组的原型。
- 在此对象上添加非数字键。
- 使用JSON.stringify序列化此对象
- 你会看到没有任何东西从这个对象序列化。
~~~
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
即使没有任何物体,也可以玩这个概念。