我为我的jQuery调用定义了一个ajax dataFilter,它返回JSON数据以确保.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;
}
});
replaceMicrosoftJSONDates
功能正常;它以递归方式遍历对象并将匹配相应日期格式字符串的字符串替换为实际的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
将作为data
参数发送到ajax success
回调:
$.ajax({
type: 'GET',
cache: false,
url: __appPath + 'path/to/my/page',
success: function(data) {
console.log(data); // displays null
}
});
据我所知,此过程中涉及的jQuery私有函数是ajaxConvert
,您可以在https://github.com/jquery/jquery/blob/master/src/ajax.js#L897-979
请记住以下内容:
如果我从dataFilter
函数返回一个字符串,jQuery正确地完成它的工作并向我发送一个解析的JSON对象。如果我返回一个预解析的JavaScript对象,jQuery会将null
发送到我的success
回调。我在这种情况下使用jQuery 1.5.2,此过滤器使用在其他应用程序和旧版本的jQuery中工作。现在突然间它似乎不再起作用了。
解
此处:http://forum.jquery.com/topic/datafilter-function-and-json-string-result-problems
答案 0 :(得分:3)
Rick Strahl最近遇到了类似的问题(这似乎是针对jQuery 1.5.2的)。因为我不想复制他的作品,所以这是他的解决方案,可以很容易地指导你解决问题:http://codepaste.net/i89xhc
答案 1 :(得分:1)
从我的经历中快速评论一下:
无论你将dataFilter方法用于远程验证,只要确保它返回stringyfied布尔值,就像这样:
return $.toJSON(true)
or
return $.toJSON(false)
我失去了几个小时才能找到这个:)