經過網友指出,這個問題已經有了比較明確的結論,那就是jquery ajax方法的complete方法是不會處理dataType的,所以如果你是在complete裏面試圖直接用json數據是不可行的,必須先通過eval。
以下是我原來的文章,大家僅作個參考,已經沒有太大價值了。
$.ajax方法如下:
- $.ajax({
- type: "POST",
- url: ctxRoot+'FolderAction!saveInformSetting.action',
- data: 'jsonStr=' + inform_settingListStr,
- dataType: "json",
- complete: function(data){
- //在這裏做些事情,假設返回的json數據裏有name這個屬性
- //有時候可以直接data.name或者data['name']去訪問
- //但有時候,卻要通過var jsonData = eval("("+data.responseText+")");纔可以通過jsonData.name訪問,而且這種情況下,需要是complete而不是success
- }
- });
ok, 問題已經在代碼的註釋裏面說明了,下面說下造成這兩種不同的原因。
先說明第一種情況:
我發現能夠直接 data.屬性名訪問的情況,服務器端代碼一定是直接renturn的一個常量字符串。
什麼是常量字符串呢,有些人可能不太清楚,常量字符串就是指直接用“”組成的字符串,沒有定義String 變量直接把一串“”print到前臺的情況,就可以直接data.屬性名訪問,而且jquery端只要寫success就可以拿到。
下面是造成要eval並且不能進入success的原因:
這種情況是因爲服務器端向外print的時候是一個String對象,通常此類問題在我的代碼裏是因爲後臺json比較複雜,在組織的時候我用到了StringBuffer,然後最後print的時候print的是StringBuffer對象的toString,所以就相當於print了一個String對象
這種情況下jquery的ajax方法就不會進入success方法,只能用complete接收,並且想要解析data裏的json數據的話,必須對data.responseText進行eval
除此兩點,還有需要注意的是,如果你使用的是jq1.4,那麼他對json的格式有着更嚴格的要求,所有的key和屬性都要用雙引號標註起來,雖然key不用雙引號原生的js是允許的,但是jq1.4似乎有這個要求。