![](/img/trans.png)
[英]JSON.Stringify returns empty array when Stringifying array of objects
[英]Best practices for stringifying JSON inner objects
基本上我有这样的事情:
我的课
var MyClass = function() {
this.num = 123;
this.obj = new MyInnerClass();
};
MyClass.prototype.stringify = function() {
return JSON.stringify(this);
};
MyInnerClass
var MyInnerClass = function() {
this.foo = 456;
this.bar = 'bonjour!';
};
MyInnerClass.prototype.stringify = function() {
return JSON.stringify(this, function(k, v) {
// ignores 'foo' attribute
return k !== 'foo' ? v : undefined;
});
};
每个类都有其自己的stringify
实现,因此当我这样做时:
var mc = new MyClass();
mc.stringify();
我希望像调用MyClass.stringify
类的东西可以对我的mc
对象进行字符串化,但是要尊重内部对象对stringify
实现的尊重。 一旦我们无法控制JSON.stringify
方法逻辑,是否有一个很好的方法来做到这一点?
谢谢!
如果您在JSON.stringify上查看MDN,则会看到有关toJSON属性的部分。
如果要被字符串化的对象具有名为toJSON的属性,其值是一个函数,则toJSON()方法将自定义JSON字符串化行为:代替被序列化的对象,由toJSON()方法返回的值将被序列化,而不是被序列化的对象。
基本上,为您的Object定义一个toJSON方法,该方法创建另一个Object ,但是可以根据需要将其序列化。 然后JSON.stringify
将序列化您的toJSON
函数的返回值,即
var MyClass = function() {
this.num = 123;
this.obj = new MyInnerClass();
};
var MyInnerClass = function() {
this.foo = 456;
this.bar = 'bonjour!';
};
MyInnerClass.prototype.toJSON = function () {
// shallow clone `this`, except .foo
var o = Object.create(null), k, blacklist = ['foo'];
for (k in this) // loop over enumerable properties
if (Object.prototype.hasOwnProperty.call(this, k)) // ignore inherited properties
if (blacklist.indexOf(k) === -1) // ignore blacklisted properties
o[k] = this[k]; // add to our clone
return o;
};
JSON.stringify(new MyClass()); // '{"num":123,"obj":{"bar":"bonjour!"}}'
这也将取代您对当前stringify方法的需求。
遗憾的是,您无法在.toJSON
调用JSON.stringify(this)
,因为它变成了循环并且会出现RangeError: Maximum call stack size exceeded
,但是无论如何您都无法以这种方式获得所需的结果,因为它将第二次序列化,在JSON中给您一个String 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.