[英]Serialize a working JavaScript object as JSON retaining only properties?
想象一下,我在JavaScript中具有如下類型的層次結構:
function Person( newName )
{
this.name = name;
this.hats = []
}
Person.prototype = {
findHat : function( hatName ) {
var i=0;
for ( i; i< this.hats.length; i++ )
{
if ( hats[i].name === hatName )
{
return hats[i];
}
}
return { name: "no hat found" };
}
}
function Hat( name, description )
{
this.name= name;
this.description = description;
}
現在我想做的就是創建一些實例...
var bob = new Person( "Bob" );
bob.hats.push( new Hat("Top Hat", "Very smart."));
bob.hats.push( new Hat("Wooly Hat", "Very warm."));
...然后以獲取簡單屬性並記錄對象層次結構但不記錄功能的方式對其進行序列化,以便我可以將其直接反序列化為那些類型,但是例如(如果)我想更改findHat
我可以將存儲的數據安全地加載到重新定義的Person
類型中。 像這樣:
“人:{”名稱“:”鮑勃“,”帽子“:[帽子:{”名稱“:”禮帽“,”描述“:”非常聰明。“},帽子:{”名稱“:”羊毛帽子“,”描述“:”非常溫暖。“}]}”
顯然,這是一個高度簡化的模型,我正在處理現實中復雜且可能很深的對象層次結構,因此,如果可以避免在類中創建任何其他類型或手動創建序列化和反序列化方法,那將是理想的選擇。
該項目完全由運行在瀏覽器中的JavaScript編寫,我正在考慮將數據存儲在本地存儲中或將其發布回服務器,因此我假設JSON是執行此操作的自然方法,但是我沒有它與純JSON序列化一起使用了很多,看起來好像偏愛匿名類型,這使我很難將數據與對象類型相關聯。 是否有一種簡單的方法(或標准庫)來實現這一目標,或者我是否需要着手像幾年前那樣對所有內容進行顯式序列化?
JSON.parse
和JSON.stringify
允許您插入它們正在執行的操作,因此您可以自定義序列化。 另外,您可以在類型的原型對象中添加toJSON
方法,該方法被調用以將其序列化為JSON,從而使您可以完全控制該過程。
JSON.stringify
使您可以通過兩種方式自定義序列化結果:
如果對象具有toJSON
方法,則JSON.stringify
使用該方法。
它使您可以指定一個“替換器”函數,該函數將為每個要序列化的項目調用,以便給您一點自定義序列化的機會。 您可以借此機會在輸出對象返回時用所需的類型標記輸出對象。
JSON.parse
使您可以指定一個“ reviver”函數,該函數本質上是相反的。 因此,您可以在原始對象上尋找特殊的序列化類型屬性,並將其與原始對象數據結合使用以創建您的類型化對象。
我不喜歡JSON。*的方式是,您需要編寫執行序列化/反序列化的函數。 我寫了一個小庫,可以使用構造函數將JSON和javascript對象混合在一起。 在您的情況下,如下所示:
let person = JsonMix(data)
.withObject(Person, "Person")
.withObject(Hat, "Person.hats")
.build();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.