2012-05-22 84 views
1

所以當Ajax調用返回一個JSON回覆,我做的:JSON對象答覆解析

oData = JSON.parse(sReply); 

其中

var oData = new cData(); 

function cData() { 
    this.Email = ""; 
    this.Name = ""; 
    this.test = function() { 
     alert("lol"); 
    } 
} 

的問題是,JSON字符串只包含電子郵件地址和名稱變量,所以當oData = JSON.parse(sReply)發生時,函數測試會被覆蓋,當我試圖調用函數時它不存在。有沒有辦法避免這種情況?我可能有許多函數和其他變量,我不想通過JSON傳輸。

+0

你可以發佈JSON值和oData對象的期望輸出嗎? – jbabey

回答

3

oData = JSON.parse(sReply); - 創建一個JavaScript對象。 oData之前是否爲cData對象......您只需重新分配它即可。

您應該能夠把你的JSON響應和手動分配的屬性到現有cData對象:

var oData = new cData(); 
var response = JSON.parse(sReply); 
oData.Email = response.Email; 
oData.Name = response.Name; 

,或者你可以通過屬性循環:

for (var i in response) 
    oData[i] = response[i]; 
+0

非常感謝!這就是我所做的,解析了對響應的回覆,然後用一個oData.init函數分配了相應的變量。我認爲我將不得不聲明響應作爲oData的簡化版本(沒有函數),但它是需要的! – MIrrorMirror

3

JSON沒有編碼功能的規定。它只適用於數據。

當然,您可以將函數序列化爲JavaScript中的字符串,並且類似地重新構造它們,但在其他語言中這不會起作用。 (將你的Python代碼做什麼用JavaScript函數?)

如果你仔細想想數據交換的一般問題,尤其是當它涉及到從完全信任的供應商服務,使功能通過數據編碼的想法得到相當害怕。

+0

我不想在python中使用js代碼。 oData是一個javascript對象,它使用函數來處理用戶數據,比如test()函數。我只是使用json來填充對象的預期變量 – MIrrorMirror

+0

好的,我明白了。是的,那麼@Travesty3有正確的答案。 – Pointy

2

一種常見方式解決此問題的方法是爲您的Object(cData)提供一個靜態factory method,它將接受DTO(Data Transfer Object)並返回一個新的cData實例,即:

function cData() { 
    this.Email = ""; 
    this.Name = ""; 
    this.test = function() { 
     alert("lol"); 
    } 
} 

// Static factory which produces a new `cData` object from the supplied 
// Data Transfer Object. Note this function belongs to the Constructor 
// function rather than instances created when it's used. 
cData.fromDTO(value) { 
     // Create a new cData instance. 
     var result = new cData(); 

     // Copy the properties from the DTO. 
     result.Email = value.Email; 
     result.Name = value.Name; 

     // Return the populated instance. 
     return result; 
} 

然後,您可以使用靜態工廠來處理AJAX調用的結果,即:

function onAjaxResponse(response) { 
    var myData = cData.fromDTO(JSON.parse(response)); 

    // Invoke the 'test' method. 
    myData.test(); 
} 

這也提供了數據傳輸層之間的明確分工(數據來自未來服務器)和你的業務邏輯(你的JavaScript應用程序);如果您需要更改DTO的屬性(例如:Name更改爲FirstName),那麼您只需在一個位置修改代碼(fromDTO工廠方法)。作爲一個便箋,你應該考慮making use of BumpyCaps when naming Constructor Functions(即:第一個字符應該是大寫,即:MyClass,而不是myClass,就像其他功能一樣)。

+0

非常有趣的方法,謝謝,雖然它似乎有點矯枉過正。我只是做了response = JSON.parse(reply),然後oData.Email = response.Email(在一個oData init函數中,它接受響應變量的參數) – MIrrorMirror

+0

是的,這也是一個有效的解決方案 - 我會說我的方法受益於將對象構造與業務邏輯分離(即:現在,所有cData實例都攜帶一個init()方法,而這些方法不需要他們的工作)。雖然它是用Java編寫的,但是[Misko Hevery的文章](http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/)可能會讓人對這個主題有更深入的瞭解。 – JonnyReeves