如何在自定义toJSON方法中使用JSON.stringify?

因此,JSON.stringify提供了一种很好的方式来转换JS对象,如:

var baz={“foo”:1,“bar”:someFunction};

在中,输入一个JSON字符串,如:

{“foo”:1}

它使用可选的第二个参数来实现这一点,该参数控制应序列化哪些字段:

JSON.stringify(baz,[“foo”]);

那很好,但是有个问题。假设您的“baz”实际上是另一个对象的属性,您希望序列化该另一个对象:

someObject.baz={“foo”:1,“bar”:someFunction};
stringify(someObject,[“baz]”);

通常,您只需在baz上定义一个toJSON方法,例如:

someObject.baz={“foo”:1,“bar”:someFunction};
someObject.baz.toJSON=function(){/*逻辑到“toJSON”baz*/}
stringify(someObject,[“baz]”);

现在,正如我前面提到的,我们已经有了“toJSON”baz的完美逻辑:

someObject.baz.toJSON=function(){
返回JSON.stringify(baz,[“foo”]);
}

但是如果你试着把它放到你的toJSON中,你会得到一个递归错误,因为stringify会触发toJSON,它会触发stringify,它会…:-(

您可以通过以下方法解决此问题:

someObject.baz.toJSON=function(){
var oldToJON=this.toJSON;
this.toJSON=null;
var ret=JSON.stringify(baz,[“foo”]);
this.toJSON=oldToJON;
返回ret;
}

但是……这似乎是错误的。所以,我的问题是:有没有任何方法可以在对象的toJSON方法内部利用JSON.stringify的漂亮内置序列化功能(而不必在stringify操作期间隐藏toJSON方法本身)

Crockford的json2.js说:

toJSON方法不序列化:它返回应该序列化的名称/值对表示的值,如果不应该序列化,则返回未定义的值

因此,您只需要返回您想要序列化的值。在您的情况下,baz.toJSON应该只返回您想要序列化的baz对象的部分:

someObject.baz.toJSON=function(){
返回{foo:this.foo};
};

发表评论