我解决了我认为从ajax调用返回的格式良好的json(使用jQuery 1.4.4)的奇怪问题。奇怪的是,在我的开发服务器上它工作正常但在线失败。
数据从ajax调用返回,如下所示:
returnData = { "status": true, "data": { "error_return": false, "error_index": -1, "message_display": { "main_message": "hello", "name": "tommy tune the man", "mailed_to": "t@t.com", "subject": "I tried this", "subject_message": "you have a technical question or comment.", "test_me": "you have a technical question or comment." } } };
jsLint和jsonLint都验证了这个结构。
当我尝试访问returnData.data
时发生错误在“失败”情况下,我从jQuery.ajax选项中删除了dataType,从而允许“最佳猜测”功能。如果我指定json,jQuery会抛出一个解析错误,声明无效的json。我已经尝试了各种各样的东西(包括可怕的eval()和jquery-2json插件,但没有运气。即使是jQ实用程序jQuery.parseJSON也失败了。
问题出现在FF 3.6.13和最新的Safari / Chrome中。
问题1:有没有人知道最新的jQuery会在这个问题上引发解析错误?
问题2:当我尝试以下内容时,我取得了成功:
但未定义以下内容:
奇怪的是,如果我将对象“粘贴”到控制台中,但是在脚本中,Firebug会将此视为对象 1)在console.dir中返回“no child objects” 2)但是会在console.log中显示对象。
非常感谢的想法
更新: 我发现服务器正在错误地设置内容类型。在服务器端PHP格式化JSON以进行返回(在本例中在Drupal 6中创建(我不得不破解核心可选包括“commons.inc”)),我用'application / json'替换了内容类型。现在有效。这个问题已在Drupal 7中得到纠正。
答案 0 :(得分:3)
如果引用的文字实际上正在返回的内容,请使用return_data =
部分,然后是无效的JSON。
如果你的ajax调用如下:
$.ajax({
url: "your_url",
success: function(data) {
}
});
...并且在success
内您想要访问status
值,您的JSON应该如下所示:
{ "status": true, "data": { "error_return": false, "error_index": -1, "message_display": { "main_message": "hello", "name": "tommy tune the man", "mailed_to": "t@t.com", "subject": "I tried this", "subject_message": "you have a technical question or comment.", "test_me": "you have a technical question or comment." } } }
(注意,开头没有return_data =
,最后没有;
。)
...您的success
函数应如下所示:
success: function(data) {
if (data.status) {
// ...
}
}
该示例适用于最新的Chrome,Firefox,Opera等,使用最新的jQuery。也许在某个阶段,您使用的是在封面下使用eval
的JSON解析器。您引用的示例是有效的JavaScript对象文字表示法,作为赋值语句的一部分,但不是有效的JSON。一些“JSON”解析器实际上使用eval
来解析JavaScript而不是JSON,这可能是你的问题。
答案 1 :(得分:0)
查看我的更新,因为我已解决了问题。我为在原帖中没有更具体的内容而道歉。变量returnedData
实际上在成功回调中(抱歉没有指定。)
为清楚起见,我使用以下内容与jQ submit()函数(在此表单提交的单击处理程序中):
var ajaxOptions = {
type: 'POST',
url: url,
dataType: "json",
beforeSubmit: checkInput,
success:
evaluateResponse
}
e.preventDefault();
$(this).ajaxSubmit(contactOptions);
成功回调的地方是:
function
evaluateContactResponse(returnData) {
//and so on }
(旁注:我正在使用jQ表单插件,直到发生这些故障,但由于表单插件无声地失败而转移到另一个实现。我现在可以将其移回,因为表单插件非常优雅。)
回调“evaluateResponse”是进行解析的地方,正如我所说,现在可以正常工作。
再次感谢...你是个聪明人 Ñ