这两种返回JSON对象的方法有什么区别?

时间:2010-02-22 22:04:42

标签: c# asp.net jquery ajax json

我正在玩jQuery Week Calendar并试图让它发挥作用,但我无法弄清楚为什么会出错。

日历有一个方法,它返回一个事件列表,用自己填充。

该方法(使用预设事件进行演示)如下所示:

function getEventData() {
      var year = new Date().getFullYear();
      var month = new Date().getMonth();
      var day = new Date().getDate();

      return {
         events : [
            {
               "id":1,
               "start": new Date(year, month, day, 12),
               "end": new Date(year, month, day, 13, 30),
               "title":"Lunch with Mike"
            },
            ...
            {
               "id":6,
               "start": new Date(year, month, day, 10),
               "end": new Date(year, month, day, 11),
               "title":"I am read-only",
               readOnly : true
            }
         ]
      };
   }

我更改了它,以便它使用jQuery GET到另一个页面,该页面将返回实际日期列表。为了测试,我保留了相同的测试数据,以确定帖子是否正确完成。

该方法将调用该页面,它将在responseText属性中返回此内容。

{ 
  events : [
        {
           'id':1,
           'start': new Date(2010, 2, 22, 12),
           'end': new Date(2010, 2, 22, 13, 30),
           'title':'Lunch with Mike'
        },
        ...
        {
           'id':6,
           'start': new Date(2010, 2, 28, 10),
           'end': new Date(2010, 2, 28, 11),
           'title':'I am read-only',
           readOnly : true
        }
     ] 
 }

我失踪的两种方法有区别吗?这两个对象对我来说看起来完全一样,除了第二个对象使用'而不是',因为它是通过C#编写的,并且它不使用年/月/日变量。

问题是第二种方法抛出一个错误,说“G未定义”,有没有理由jQuery不喜欢我正在返回的JSON对象?

编辑:我想我找到了错误的来源。在其中一个方法中有一个if语句:

 if (typeof options.data == 'string') {
        if (options.loading) options.loading(true);
        var jsonOptions = {};
        jsonOptions[options.startParam || 'start'] = Math.round(weekStartDate.getTime() / 1000);
        jsonOptions[options.endParam || 'end'] = Math.round(weekEndDate.getTime() / 1000);
        $.getJSON(options.data, jsonOptions, function(data) {
           self._renderEvents(data, $weekDayColumns);
           if (options.loading) options.loading(false);
        });
     }
     else if ($.isFunction(options.data)) {
        options.data(weekStartDate, weekEndDate,
              function(data) {
                 self._renderEvents(data, $weekDayColumns);
              });
     }

当刚刚在getEventData()中输出JSON对象时(第一种方式)它会触及else语句,因为它被识别为一个函数(我猜),但是当我执行ajax GET时,它被认为是一个字符串,进入if。

是否有将此识别为功能?我尝试用大括号包装返回值,将dataType更改为脚本并使用eval()将结果转换为函数,但这些似乎都不起作用。

3 个答案:

答案 0 :(得分:0)

您是否尝试将事件括在引号中?

'事件':[....

答案 1 :(得分:0)

将您的回复文字放入JSON validator并查看问题所在。

另请注意,将new Date(2010, 2, 28, 10)直接输出到文本中被认为是不好的做法,而是使用实际值,然后使用JS在客户端解析它们。 (我相信这是最明显的错误,只要你不使用eval来解析你的JSON字符串:))

,因为jQuery 1.4.0,库是非常严格的,关于如何格式化JSON(你的json文本错过了键的引号)

答案 2 :(得分:0)

在搜索完Google后,我遇到了jQuery Week Calendar Google Group,而this discussion遇到的问题完全相同。

我认为主要问题是DateTimes格式不正确。返回事件JSON对象正确地直接转换了日期,但我的ajax调用返回new Date(2010, 02, 23, 12)作为时间。它导致它无声地失败。将日期时间更改为2010-02-23T12:15:00.000+10:00似乎已修复它。

然而,该用户似乎对events : [违反JSON的行为不正确。我把它留在了我的ajax调用中,它仍能正常工作。