2011-06-13 115 views
1

使用在http://api.jquery.com/jQuery.ajax/(或其他任何地方)定義的許多選項之一,可以將傳入數據映射到特定數據類型而不是通常返回的默認通用對象?JQuery Ajax獲取自定義

我通常的方法是通過獲取每個屬性並將其放置到我真正想要使用的新對象的構造函數中來「轉換」生成的對象。然後,我忘記了舊物件。我會想象有一個更有效的方法來做到這一點。

我想出了一些想法,比如簡單地向每個返回的對象添加方法。它運作良好,但我只需知道是否有更有效的方法。

+0

你能舉一個你想要的例子嗎? – simshaun 2011-06-13 21:23:59

+0

您是否嘗試設置'dataType'選項?你也可以嘗試[自定義數據類型](http://api.jquery.com/extending-ajax/#handling-custom-data-types)。 – Na7coldwater 2011-06-13 21:29:13

+0

@simshaun我認爲Na7coldwater解釋得很好。請看下面他的答案的第一部分。 – BDawg 2011-06-14 20:16:25

回答

3

所以你說你有一個像下面的代碼:

function Pirate(name, hasParrot) 
{ 
    this.name = name; 
    this.hasParrot = hasParrot; 
} 

和服務器發送該JSON數據:

{ 
    name: "Blackbeard", 
    hasParrot: true 
} 

這jQuery是轉換爲普通對象,右鍵? 如果是這樣的話,你可以使用一個custom datatype直接解析服務器的數據轉換成海盜對象,像這樣:

// First define the converter: 
jQuery.ajaxSetup({ 
    converters: { 
    "json pirate": function(obj) { 
     if(!obj.name || typeof obj.hasParrot === "undefined") 
     { 
     throw "Not a valid Pirate object!"; 
     } 
     else 
     { 
     return new Pirate(obj.name, obj.hasParrot); 
     } 
    } 
    } 
} 
// Then use it! 
$.ajax("http://example.com/getPirate", { 
    data: {id: 20}, 
    dataType: "pirate", 
    success: function(pirate){ 
    console.log(pirate instanceof Pirate); // Should be true 
    } 
}); 

編輯:如果你真的想跳過轉換成JSON的步驟,你可以能用"text pirate"替換上面的"json pirate",然後爲由ajax調用返回的原始文本編寫您自己的解析器。

+0

哈哈,我喜歡這個例子,但我認爲這與瀏覽器/設備的工作量大致相同。它看起來仍然將json字符串解析爲一個通用對象,並將存儲在該對象中的值傳遞給另一個對象類型的新實例。我試圖找出是否有辦法讓ajax直接解析json字符串到盜版對象中。但是,似乎你理解我的問題。考慮到我在工作一整天之後立即輸入了密碼,我很驚訝任何人都知道了。 – BDawg 2011-06-14 15:55:46

+0

@BDawg我編輯了我的答案,包括直接從原始文本轉換的說明。 – Na7coldwater 2011-06-15 16:33:46

+0

哈!美麗!先生,你贏了。非常感謝你! – BDawg 2011-06-15 17:50:21