0

我在解析我认为从 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:当我尝试以下操作时,我成功了:

  • var 成功 = returnData.status;

但是以下是未定义的:

  • var errorReturn = returnData.data.error_return。

奇怪的是,如果我将对象“粘贴”到控制台中,Firebug 会将其视为一个对象,但在脚本中 1)在 console.dir 中返回“无子对象” 2)但会在 console.log 中显示该对象。

非常感谢的想法

更新:我发现服务器设置的内容类型不正确。在格式化 JSON 以返回的服务器端 PHP 中(在这种情况下在 Drupal 6 中创建(我不得不破解核心可选包括“commons.inc”),我用“应用程序/json”替换了内容类型。这个现在可以工作了。这个问题已经在 Drupal 7 中得到纠正。

4

2 回答 2

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。也许在某个阶段,您正在使用在幕后使用的 JSON 解析器eval。您引用的示例是作为赋值语句一部分的有效 JavaScript 对象文字表示法,但不是有效的 JSON。一些“JSON”解析器实际上用于eval解析 JavaScript 而不是 JSON,这可能是您的问题。

于 2011-01-22T12:28:43.737 回答
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”是进行解析的地方,正如我所说,现在可以工作了。

再次感谢...你是个聪明人 N

于 2011-01-22T13:40:10.840 回答