jquerydatafilter以某种方式导致将空数据发送到ajax成功回调

jquerydatafilter以某种方式导致将空数据发送到ajax成功回调,jquery,ajax,Jquery,Ajax,我为返回JSON数据的jQuery调用定义了一个ajax数据过滤器,以确保.Net编码的日期在返回时自动转换为JavaScript日期: $.ajaxSetup({ dataFilter: function(data, type) { var rx = /"\\\/Date\(([0-9]+)\)\\\/"/g; if(type == 'json' && typeof(data) == 'string' && rx.test

我为返回JSON数据的jQuery调用定义了一个ajax数据过滤器,以确保.Net编码的日期在返回时自动转换为JavaScript日期:

$.ajaxSetup({
    dataFilter: function(data, type) {
        var rx = /"\\\/Date\(([0-9]+)\)\\\/"/g;
        if(type == 'json' && typeof(data) == 'string' && rx.test(data)) {
            var obj = JSON && JSON.parse ? JSON.parse(data) : eval(data);
            replaceMicrosoftJSONDates(obj);
            return obj;
        }
        return data;
    }
});
replaceMocrosoftJSondates
函数工作正常;它递归地遍历对象,并用实际的JavaScript日期替换与适当的日期格式字符串匹配的字符串,但这里它用于测试目的:

function replaceMicrosoftJSONDates(obj) {
    for(var p in obj)
        switch(typeof(obj[p])) {
            case 'string':
                var match = /^\/Date\(([0-9]+)\)\/$/.exec(obj[p]);
                if(match) obj[p] = new Date(parseInt(match[1]));
                break;
            case 'object':
                replaceMicrosoftJSONDates(obj[p]);
                break;
        }
}
问题在于dataFilter函数。如果我返回修改后的JSON对象,
null
作为
数据
参数发送到ajax
success
回调:

$.ajax({
    type: 'GET',
    cache: false,
    url: __appPath + 'path/to/my/page',
    success: function(data) {
        console.log(data); // displays null
    }
});
据我所知,这个过程中涉及的jQuery私有函数是
ajaxConvert
,您可以在

请记住以下几点:

  • 这不是跨域脚本调用
  • 服务器返回一个HTTP200(OK)响应,responseText包含完整的数据
  • 数据正正确发送到dataFilter函数
  • dataFilter函数似乎可以正确地解析和修改响应,并返回一个有效的JavaScript对象,该对象已经解析并准备使用
如果我从
dataFilter
函数返回一个字符串,jQuery将正确执行其工作并向我发送一个解析的JSON对象。如果我返回一个预解析的JavaScript对象,jQuery会将
null
发送到我的
success
回调。在本例中,我使用的是jQuery 1.5.2,这个过滤器用于其他应用程序和jQuery的旧版本。现在突然间,它似乎不再起作用了

解决方案


这里:

Rick Strahl最近遇到了类似的问题(这似乎是针对jQuery 1.5.2的)。由于我不想抄袭他的作品,以下是他的解决方案,可以很容易地指导您解决问题:

根据我的经验,我只想简单评论一下:

无论在何处放置用于远程验证的dataFilter方法,只要确保它返回stringyfied布尔值,如下所示:

     return   $.toJSON(true)  
  or 
     return  $.toJSON(false)

我花了几个小时才发现:)

看不出他的解决方案与我的问题有什么关系-你链接的代码似乎与日期转换算法有关,这不是这里的问题。他的解决方案简单地展示了如何使用“转换器”设置,与我们在jQuery 1.5.2之前使用dataFilter的目的相同(它甚至还可以进行.Net日期清理-以一种稍微不同的方式进行,但您可以很容易地知道将代码放在哪里)下面是论坛帖子,他在其中解释了解决方案:是的,我真愚蠢,没有首先通过那个链接Rick Strahl关于使用数据转换器而不是数据过滤器的帖子上的评论对我有效。这对我有效,尽管我使用了JSON的
JSON.JSON.js
实现中的
json2.js
G