簡體   English   中英

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

[英]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方法本身)?

克羅克福德的json2.js說:

toJSON方法不會序列化:它返回由應該被序列化的名稱/值對表示的值,或者如果沒有任何序列化則返回undefined。

因此,僅希望您返回要序列化的值。 在您的情況下, baz.toJSON應該只返回要序列化的baz對象的一部分:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM