[英]How do you use JSON.stringify in a custom toJSON method?
因此,JSON.stringify提供了一種轉換JS對象的好方法,例如:
var baz = {"foo":1, "bar":someFunction};
輸入JSON字符串,例如:
{"foo":1}
它使用一個可選的第二個參數來執行此操作,該參數控制應序列化哪些字段:
JSON.stringify(baz, ["foo"]);
很好,但是有一個問題。 假設您的“ baz”實際上是另一個對象的屬性,並且您想要序列化另一個對象:
someObject.baz = {"foo":1, "bar":someFunction};
JSON.stringify(someObject, ["baz"]);
好吧,通常您只需要在baz上定義一個toJSON方法,例如:
someObject.baz = {"foo":1, "bar":someFunction};
someObject.baz.toJSON = function() { /* logic to "toJSON" baz*/ }
JSON.stringify(someObject, ["baz"]);
現在,正如我前面提到的,我們已經有了完美的邏輯來“ toJSON” baz:
someObject.baz.toJSON = function() {
return 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;
return ret;
}
但是...這似乎是錯誤的。 所以,我的問題是:有什么方法可以利用對象的toJSON方法內部的JSON.stringify內置的強大序列化功能(而在stringify操作期間不必隱藏toJSON方法本身)?
toJSON方法不會序列化:它返回由應該被序列化的名稱/值對表示的值,或者如果沒有任何序列化則返回undefined。
因此,僅希望您返回要序列化的值。 在您的情況下, baz.toJSON
應該只返回要序列化的baz
對象的一部分:
someObject.baz.toJSON = function() {
return { foo: this.foo };
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.