2010-02-20 68 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 
     } 
    });