1. 程式人生 > >Jquery ajax方法解析返回的json資料

Jquery ajax方法解析返回的json資料

最近在用jquery的ajax方法傳遞接收json資料時發現一個問題,那就是返回的data資料,有時候可以直接作為json資料使用,可有時候又不行。 

經過網友指出,這個問題已經有了比較明確的結論,那就是jquery ajax方法的complete方法是不會處理dataType的,所以如果你是在complete裡面試圖直接用json資料是不可行的,必須先通過eval。 

以下是我原來的文章,大家僅作個參考,已經沒有太大價值了。 

$.ajax方法如下: 

Java程式碼  收藏程式碼
  1. $.ajax({   
  2. type: "POST",  
  3. url:  ctxRoot+'FolderAction!saveInformSetting.action',  
  4. data: 'jsonStr=' + inform_settingListStr,  
  5. dataType: "json"
    ,  
  6. complete: function(data){  
  7.     //在這裡做些事情,假設返回的json資料裡有name這個屬性  
  8.     //有時候可以直接data.name或者data['name']去訪問  
  9.     //但有時候,卻要通過var jsonData = eval("("+data.responseText+")");才可以通過jsonData.name訪問,而且這種情況下,需要是complete而不是success  
  10. }  
  11. });   



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似乎有這個要求。