2009-10-19 43 views
6

我有一個這樣的對象:如何使用JSON重新構建Javascript對象?

var someObj = Class.create ({ 
    initialize: function(objName){ 
     this.objName = objName; 
    } 
}); 

我可以使用

o = new someObj("objName"); 

作出OBJ。我可以使用Object.toJSON(o)將o變成JSON字符串,但我希望JSON字符串轉換回someObj,因此,我使用eval()來傳遞 JSON字符串以成爲對象,但問題是,它可以成爲一個JS Obj, ,但是「o」的構造函數不是someObj。如何通過使用 「someObj」作爲構造函數來評估JSON字符串?

回答

5

JSON字符串不能用成員函數表示對象,所以你唯一會從JSON字符串中得到的是原始數據。假設toJSON方法會生成一個JSON字符串,用於表示包含您的類實例的所有非函數成員的對象,您應該能夠獲取生成的對象並附加原型以獲取所有函數。例如,使用jQuery的方便extend功能:

var o = new someObj("objName"); 
var json = Object.toJSON(o); 
var json_obj = eval(json); 
$.extend(json_obj, someObj.prototype); 
json_obj.someMethodDefinedOnsomeObj() 

根據您如何使用該框架來表示類在JavaScript中利用了原型對象模型,您milage很可能與上面的例子。另外,使用eval()會產生一個安全漏洞,所以如果你不相信JSON字符串來自哪裏,你應該使用不同的反序列化方法。只是爲了完全覆蓋,這裏是我如何與原始原型做到了:

function Animal(name){ 
    this.name = name; 
} 
Animal.prototype.talk = function(){ 
    console.log("My name is "+this.name); 
} 

var a = new Animal("Brendan Eich"); 
a.talk(); 

var json = '{name: "Tim Berners-Lee"}' 
var b = eval(b); 
$.extend(b, Animal.prototype); 
b.talk(); 

在螢火控制檯這將產生輸出:

我的名字是布蘭登·艾克

我的名字叫蒂姆Berners-Lee

0

你使用的是prototypejs正確嗎?我總是發現那些棘手的問題,結果只是讓我自己的初始化工具讀入一個已經被編輯或者json字符串本身的對象。

+0

是的,我使用的是原型js。 – DNB5brims 2009-10-20 11:35:50

2

http://json.org/js.html

var myObject = JSON.parse(myJSONtext, reviver); 

可選參數齊磊見JSON revivers是 功能將被要求在 最終結果的每個級別每個 鍵和值。每個值將由 函數的結果替換爲 。這可用於將 通用對象重構爲 僞類的實例,或將日期 字符串轉換爲Date對象。