2010-06-28 36 views
3

下面是一些簡單的Javascript:如何讓JQuery接受JSON回覆?

(function($){ 
    var ajax_callback = function(data) { window.location.hash = data.h1; }; 
    $('.clickable').live('click', function() { 
      $.post('server.fcgi', {}, ajax_callback, 'json'); 
     } 
    ); 
})(jQuery); 

服務器是一個C++二進制(是的,我知道)吐出(通過fast_cgi)字符串: {"h1":"newhash"}

預期的行爲是URL應該改變。 相反,沒有任何反應,Firebug抱怨'數據'是「空」! 任何幫助將不勝感激!

請問。

當下面的代碼輸入「ajax_callback」時,它說「data」是「null」! 但服務器是一個C++二進制文件,確認它返回JSON字符串{"h1":"newhash"}。 任何人都有一個想法,當調用ajax_callback時,爲什麼JQuery似乎無法接受JSON數據?

+0

您的服務器「application/json」的響應內容類型是什麼? – patmortech 2010-06-28 07:11:38

回答

0

確保服務器也在有效負載之前返回正確的HTTP標頭。例如: -

HTTP/1.0 200 OK 
Content-Type: application/json 
Content-Length: ... 
... 

{"h1":"bla"}

從你的描述,我不能完全做出來,如果它所作的只是printf("{\"h1\":\"bla\"}");與否。

要檢查實際的結果,使用命令行工具,如HEADGETwgetcurl,甚至nc。如果你不能使用其中的一個,你可能會從Firebug等的Net面板中得到一些線索。

+0

如果你在Windows機器上,我會推薦Fiddler。這是一個可靠的HTTP請求/響應查看器。 – 2010-06-28 19:15:21

+0

謝謝。令人尷尬的是,我已經忘記了標題後面的「\ r \ n \ r \ n」,這個錯誤意味着什麼都沒有完成。 (也許不是一個好的設計決策,它會讓它無聲無息地失敗)。 感謝您的回覆。 – 2010-06-29 23:05:11

0

可能不是您想要聽到的答案,但我認爲您使用的是jQuery 1.4.2?我注意到這在1.3.2中按預期工作,因此您可能需要考慮使用它。 :(

2

我的確有類似的問題,因爲您在使用$ .POST()時提到過 如果您使用jQuery $ .post方法,您需要在定義的數據類型之前添加一個額外的括號( 「JSON」),如下圖所示。我不知道爲什麼,但它的工作原理,它會返回數據。

$.post('server.fcgi', {}, ajax_callback,{}, 'json'); 

的第二件事情是,你需要使用$ .parseJSON(數據)來解析JSON數據側回調函數

還有一件事要確保獲取JSON的url,頁面文檔類型應該被定義爲標頭中的JSON。

我在下面給出了一個例子。

$.post("url/path/here/to/json", {}, function(data){ 

    if(data){ // just in case the called program had a problem 
     var obj = $.parseJSON(data); 
     .... do everything else using the Obj->   
    } 
},{},"json"); 

這會奏效。

不過我建議你使用其他jQuery函數用於JSON專門實施,被稱爲

$.getJSON(); 

這裏是url for more information

而且我建議您使用以下方法,而不是一個由你描述。

$(document).ready(function(){ 

    $('.clickable').live('click', function() { 
      $.getJSON('server.fcgi', function(data){ 
         window.location.hash = data.h1; 
       }); 
     } 
    ); 
}); 
+0

這個解決方案正在做什麼,據我所知,只是簡單地將dataType參數設爲一個空對象。我相信.post默認爲「文本」的數據類型,所以這就是爲什麼這個工程。 – 2010-06-28 19:13:59

+0

我的確同意@ Ryan Kinal的評論,可能這就是它以這種方式工作的原因。 – Raftalks 2010-06-28 19:56:25

+1

謝謝你的回覆。 我想我會按照你的建議使用getJSON。 這是我發現的一個愚蠢的事情(困難的方法):你需要在JSON頭之後的「\ r \ n \ r \ n」。 我猜如果你使用php或perl這些是在標題中自動生成的,但對於c/C++用戶,你實際上必須「手動」輸出這些。 這解決了問題的一部分,您的回答解決了其餘問題。 謝謝! – 2010-06-29 23:03:34