【问题标题】:What is the difference between these two ways of returning a JSON object?这两种返回 JSON 对象的方式有什么区别?
【发布时间】:2010-02-22 22:04:41
【问题描述】:

我正在使用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() 将结果转换为函数,但这些似乎都不起作用。

【问题讨论】:

    标签: c# asp.net jquery ajax json


    【解决方案1】:

    您是否也尝试将事件用引号括起来?

    “事件”:[ ....

    【讨论】:

      【解决方案2】:

      将您的回复文本放入JSON validator,看看问题出在哪里。

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

      从 jQuery 1.4.0 开始,该库非常严格,关于 JSON 的格式(您的 json 文本缺少键的引号)

      【讨论】:

      • Brandon 在另一条评论中指出他使用的是 1.3.2。此外,原始版本使用new Date(...) 获取值。良好的做法与否,问题仍然是它为什么停止工作。
      【解决方案3】:

      通过 Google 搜索后,我发现 jQuery Week Calendar Google Groupthis discussion 遇到了与我完全相同的问题。

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

      但是,该用户似乎对 events : [ 破坏 JSON 的看法不正确。我把它留在了我的 ajax 调用中,它仍然可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 2019-03-31
        • 2021-09-28
        • 1970-01-01
        相关资源
        最近更新 更多