2012-06-22 38 views
3

我想從我的服務器,像這樣取得一些JSON數據:

var a = $.ajax({ 
    url: "data.json", 
    dataType: 'json', 
    data: null, 
    error: function(data) { 
     console.log("error"); 
    }, 
    success: function(data) { 
     console.log("success"); 
    } 
}); 

當我做到這一點,error函數被調用(error被打印到控制檯)。

然而奇怪的是,當我檢查a我看到正確的響應文本已返回。

a

readyState: 4 
responseText: "contents of data.json!" 
status: 200 
statusText: "OK" 

這是怎麼回事?如果請求成功,爲什麼不成功回調觸發?

+3

是'responseText'有效的JSON?您可以使用[JSONLint](http://jsonlint.com/)進行檢查。 –

+1

@ ianpgall的答案是正確的,但你也應該注意,在你的選擇到底是一個額外的逗號對象(6號線)。 – Hal

+0

好點@harrison_m 34,但這似乎不是在JavaScript中的錯誤,至少在較新的瀏覽器。我已經看到,在舊版本的IE中打破東西(也許更新)。做一個簡單的網頁,並測試出來,不應該有一個錯誤 – Ian

回答

4

可能是因爲您指定的類型返回心不是具體值。響應本身是成功的(正如您通過查看「a」的細節所看到的那樣),但這不是決定是否執行成功或錯誤的唯一決定性因素。您將json指定爲「dataType」(返回類型),但收到了一個字符串。對於測試,這很好,但正如你所看到的,事情不會按預期運行。如果不指定dataType選項,jQuery將嘗試通過查看MIME類型和響應內容來確定返回的內容類型。當它們不匹配時它是一個錯誤(就像你的情況一樣)。

更新:

我意識到我在我上面的解釋中漫步。雖然你似乎解決了這個問題,但讓我再說一遍。

有幾個可能性發生在您的情況的錯誤。要理解的重要一點是,如果設置「dataType」,jQuery將嘗試使用該類型解析responseText。如果你沒有設置這個選項,它會相應地猜測和解析它(這意味着它會查看MIME類型)並以這種方式解析它。如果您指定「dataType」,則responseText需要採用JSON格式。所以,如果你指定「json」,但提供一個字符串(在你的情況),jQuery解析失敗。如果你沒有指定「dataType」和jQuery猜測,responseText需要匹配MIME類型。所以當MIME類型是「application/json」時,你不能返回一個字符串。當事情不匹配時,就是發生錯誤的時候。

希望有幫助!

+0

如果最後一句是「返回的字符串不能被解析爲JSON」? – alex

+0

謝謝@ianpgall。這解決了它! (我在我的問題中插入了僞文本,我的實際字符串看起來更像JSON,但是它有一些小怪癖使JSONLint測試失敗。) –

+0

@alex我不知道,但是我更新了我的回答:)很高興它可以幫助OP,但希望它是有道理的。 – Ian

1

只是一種預感,但返回的內容類型爲「application/JSON」?我的預感是,錯誤是JSON預期會回來,但它返回的text/html(或其他內容類型),然後不被解析。

相關問題