2010-02-20 64 views
2

我使用jQuery來調用asmx並返回一些數據。我做了這樣調用jQuery和在回調中解析JSON

function getRequestInfo(event) { 
     var id = $('#<%= RequestDaysId.ClientID %>').val(); 
     var formattedId = "{'id': '115'}"; 
     $.ajax({ 
      type: "Post", 
      url: "services/VacationServices.asmx/GetVacationInfo", 
      data: "{'id': '" + id + "'}", 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      processdata: true, 
      success: function(data) { 
       $('#<%=Note.ClientID %>').val(data.Note); 
       $('.pendingrequestinfo').show().fadeIn(2000); 
      }, 
      error: function(result, errortype, exceptionobject) { 
       $('.failureMessage').fadeIn(2000).fadeOut(2000); 
      } 
     }) 
    }; 

一切似乎做工精細,我設置我的成功函數一個破發點,並檢查數據對象和看到這一點。

"{"Note":"this is a note","dayInfo":[{"ShortDate":"3/4/2010","DayType":"Vacation","HalfDay":""},{"ShortDate":"3/5/2010","DayType":"Vacation","HalfDay":""}]}" 

當我嘗試從JSON中獲取值時,問題出現了。如果我做了類似數據的事情,請注意,我還未定義。

現在已經很晚了,這是星期六,我一整天都在這裏,當談到解析我的JSON時,我確實希望推動正確的方向。

編輯: 我使用Asp.net和JavaScriptSerializer.Serialize()來創建JSON。當我設置一個斷點並檢查'data'對象時,它看起來有一個屬性d,其中包含應該是JSON的字符串。

ANOTHER編輯: 如果我做這樣的事情在我的成功

$('#<%=Note.ClientID %>').val(data.d.[0]); 

我得到的{大括號。我想我得到的是一個字符串而不是JSON,但它似乎違背了jquery api在數據類型設置爲JSON時返回值的狀態。

謝謝你們。 Jim

+1

使用ASP.NET的JavaScriptSerializer,data.d是您希望包含在數據中的對象。我忘記了爲什麼ASP.NET將JSON包裝到一個d對象中,但答案是在「在Microsoft®Platform上開發面向服務的AJAX應用程序」的前幾章。我會看看我是否可以找到答案,或谷歌'asp.net data.d json'。此外,你的對象被包含在data.d中而不是數據是ASP.NET的錯,而不是jQuery的。 – 2010-02-21 00:53:11

回答

1

這個人是太傻了......對不起你們。當從ASMX返回數據,因此沒有必要將其序列化到JSON

我有我填充,並且只要

public class VacationInfo 
    { 
     public string Note { get; set; } 
     public List<DayInfo> dayInfo { get; set; } 
     public VacationInfo(string note, List<DayInfo> dayinfo) 
     { 
      this.Note = note; 
      this.dayInfo = dayinfo; 
     } 

     public class DayInfo 
     { 
      public string ShortDate { get; set; } 
      public string DayType { get; set; } 
      public string HalfDay { get; set; } 
      public DayInfo(string shortdate, string daytype, string halfday) 
      { 
       this.ShortDate = shortdate; 
       this.DayType = daytype; 
       this.HalfDay = halfday; 
      } 
     } 
    } 

從我的Web方法returing以下類作爲您的Web服務裝飾與

 [System.Web.Script.Services.ScriptService] 

您的對象將被序列化並返回爲JSON免費給你。:)

那麼我也能做到這一點

data.d.Note 
在我的電話

回來。

感謝您的幫助球員。

Credit where credit is due

+1

僅供參考,請參閱我對.d的回答,並使其跨版本兼容。以防萬一,以幫助你一些:)運氣給你。 – 2010-02-21 01:35:22

+0

謝謝......我看到你在那裏做了什麼,我加上了你。 :)這是我第一週使用jquery,我對它有很多樂趣,它使客戶端編碼變得有趣。 – jim 2010-02-21 01:48:16

1

這不是有效的JSON格式。在開始和結束時刪除雙引號,使其成爲完全可用的JSON。

+0

有趣...我使用JavaScriptSerializer.Serialize()方法從一個對象創建json並返回它。 – jim 2010-02-20 23:12:20

+0

我不知道你使用的是什麼平臺,但它看起來像是ASP.NET。對不起,我沒有答案。我會建議Google Gson用於JSP/Servlet,而'json_encode()'用於PHP。順便說一下,在寫入響應輸出或調試JS期間是不是偶然插入了那些引號? – BalusC 2010-02-20 23:15:03

+0

變量'data'*是一個數據對象,而不僅僅是一個字符串?你確定JSON字符串正在被反序列化嗎?如果它只是一個字符串,它可能會解釋爲什麼data.Note會給出未定義的。 – 2010-02-20 23:20:43

2

首先確保在成功回調中返回的響應中的「d」變量中存在JSON字符串。接下來,爲了獲得JSON對象,您需要將字符串轉換爲JSON。您可以使用eval函數或JQuery內置函數將字符串轉換爲JSON。我喜歡jquery-json插件將字符串轉換爲JSON表示。

您的代碼將是這個樣子:現在

var jsonObject = eval('(' + data.d + ')'); 

,您可以使用jsonObject.Note或任何其他財產。

與jQuery-JSON插件,您可以執行以下操作:

var note = $.evalJSON(data.d).Note; 
+0

+1爲工作...這是我未來找到答案的地方。 – jim 2010-02-21 01:24:02

1

這裏是我如何處理。注意dataFilter:部分 - 這使得它可以用於更新或更舊的asp.net的東西。

$.ajax({ 
     type: "POST", 
    contentType: "application/json; charset=utf-8", 
     data: objectSaveData, 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
       typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "/mywebservice.asmx/myMethodName", 
     success: function(msg) 
     { 
      //do stuff 
     }, 
     failure: function(msg) 
     { 
      //handlefail 
     } 
    });