2012-04-08 176 views
3

我無法從我的php jquery/json/ajax獲得響應。我一直將所有這些不同的教程組合在一起,但我仍然無法將它們全部合併在一起,因爲沒有一個教程遵循我所要做的。從Jquery JSON獲取響應

現在我想傳遞兩個數組(因爲沒有簡單的方法可以將關聯數組傳遞給我的jquery ajax函數並且只是提醒它)。這裏是我的代碼:

PHP

$names = array('john doe', 'jane doe'); 
$ids = array('123', '223'); 

$data['names'] = $names; 
$data['ids'] = $ids; 

echo json_encode($data); 

jQuery的

function getList(){ 
    $.ajax({ 
     type: "GET", 
     url: 'test.php', 
     data: "", 
     complete: function(data){ 
      var test = jQuery.parseJSON(data); 
      alert(test.names[0]); 
      alert("here"); 
     } 
    }, 
     "json"); 
} 
getList(); 

在我的HTML文件中的所有我真的打電話是我的調試目的JavaScript文件。我知道我正在返回一個對象,但我在我的名字部分出現空值的錯誤,我不知道爲什麼。我錯過了什麼?

我的PHP文件返回

{"names":["john doe","jane doe"],"ids":["123","223"]} 

這似乎是剛剛結束在這裏 Uncaught TypeError: Cannot read property '0' of undefined 所以我sub0是我的命。

+0

當我試圖解決這些問題,我把它分解爲兩個:服務器端和客戶端。第1步:您的服務器是否以您期望的格式返回JSON對象?嘗試在瀏覽器中打擊/test.php並檢查JSON響應。如果看起來不錯,那麼在JS回調中輸出JSON字符串。 – jmort253 2012-04-08 07:42:17

+1

我認爲在$ .ajax中,你必須設置dataType:'json'而不是'json'(最後如何處理$ .get或$ .post) – kappa 2012-04-08 07:42:53

+0

我的php文件對我來說似乎很好。我會如何去輸出我的json,看看除了alert之外,看起來如何? – 2012-04-08 07:45:56

回答

5

你可以概率使用$.getJSON門面是jQuery提供,這將設置所有標準的JSON請求所需的AJAX PARAMS:

$.getJSON('test.php', function(response) { 
    alert(response.names[0]); // john doe 
}); 

但是我認爲這個問題的途徑是1)您的服務器可能沒有返回正確的響應代碼和/或正確的標題(即:JSON數據) - 但上述方法至少對後者應該強制得出這個結論。

請參見:http://api.jquery.com/jQuery.getJSON

+0

是的,這解決了我的問題! – 2012-04-08 09:14:38

+0

我以爲你想保持$ .ajax。通常我使用$ .get(....,'json') – kappa 2012-04-08 09:55:46

+1

+1 - 這是更簡單的語法。 – jmort253 2012-04-08 19:03:31

1

您應該在單個對象中傳遞ajax()函數的所有參數。所以,應該有「dataType」選項。另外,如果您明確設置數據類型,jQuery將爲您解析JSON數據。完成回調將收到解析的JavaScript對象作爲參數。

function getList() { 
    $.ajax({ 
     type: "GET", 
     url: 'test.php', 
     data: "", 
     dataType: "json", 
     success: function(test) { 
      alert(test.names[0]); 
      alert("here"); 
     } 
    }); 
} 
+0

數據類型的良好調用。但是,我認爲問題是完整的回調不包括來自服務器的數據作爲第一個參數。我在回答中包含了對完整回調的引用。如果您將「完整」更改爲「成功」,我100%確信您的答案是正確的。 – jmort253 2012-04-08 07:50:28

+1

你是對的。我編輯了我的答案來解決這個錯誤。 – 2012-04-08 11:27:11

+0

+1,使您的答案正確。 – jmort253 2012-04-08 18:47:40

3

它看起來像問題是,你正在使用的不是成功的回調完成回調:

function getList(){ 
    $.ajax({ 
     type: "GET", 
     url: 'test.php', 
     data: "", 
     success: function(data) { /* success callback */ 
      var test = jQuery.parseJSON(data); 
      alert(test.names[0]); 
      alert("here"); 
     } 
    }, 
    "json"); 
} 
getList(); 

jQuery AJAX文檔:

成功(數據,textStatus, jqXHR)

如果請求成功,將被調用的函數。該函數傳遞三個參數:從服務器返回的數據,根據dataType參數進行格式化;描述狀態的字符串;和jqXHR(在jQuery 1.4.x,XMLHttpRequest)對象中。從jQuery 1.5開始,成功設置可以接受一系列函數。每個函數都會依次調用。這是一個Ajax事件。

完整(jqXHR,textStatus)

甲功能的請求完成(成功和錯誤回調之後被執行)時被調用。該函數獲得兩個參數:jqXHR(在jQuery 1.4.x中,XMLHTTPRequest)對象和一個字符串,用於分類請求的狀態(「成功」,「未修改」,「錯誤」,「超時」,「中止」或「parsererror」)。從jQuery 1.5開始,完整的設置可以接受一組函數。每個函數都會依次調用。這是一個Ajax事件。

2

jQuery想知道什麼樣的數據期望作爲響應,否則它不會知道如何解析它。

因此,正如在此之前所說的,您使用dataType = 'json'屬性告訴jQuery。

function getList() { 
    $.ajax({ 
     type: "GET", 
     url: 'test.php', 
     data: "", 
     dataType: "json", 
     success: function(data) { 
      console.log(data); 
     } 
    }); 
} 

最重要的是讓PHP將其內容呈現爲json而不是html。通過在PHP腳本中輸出任何內容之前設置header('Content-type: application/json');來爲此使用標題。所以:

$names = array('john doe', 'jane doe'); 
$ids = array('123', '223'); 

$data['names'] = $names; 
$data['ids'] = $ids; 

header('Content-type: application/json'); 

echo json_encode($data); 
+0

當我嘗試訪問子0時,我仍然收到空值,我更新了我的PHP文件輸出的問題。 – 2012-04-08 07:51:45

+0

@Howdy_McGee即使它現在適合你,我修正了上面的代碼,它現在也可以用.ajax()。 – Mosselman 2012-04-08 15:58:57

+0

@Mosselman - 我我使用和不使用dataType:'json'來運行ajax調用,而且回調仍然知道如何解析它。在[jQuery Ajax Docs](http://api.jquery.com/jQuery.ajax/)中,dataType:'json'在jQuery不能使用mime類型來確定返回類型的情況下很有用。在大多數情況下,這不是必需的。這也不是OP面臨的問題。 OP正在使用「完成」回調而不是「成功」。儘管如此,我認爲包含dataType是一種很好的做法,既可以作爲後備和通信的清晰度。 +1,因爲這是所有好的信息。 – jmort253 2012-04-08 18:58:54