需要帮助解决奇怪的json解析问题

时间:2011-01-22 12:24:24

标签: javascript jquery json jquery-1.4

我解决了我认为从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 success = returnData.status;

但未定义以下内容:

  • var errorReturn = returnData.data.error_return。

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

非常感谢的想法

更新: 我发现服务器正在错误地设置内容类型。在服务器端PHP格式化JSON以进行返回(在本例中在Drupal 6中创建(我不得不破解核心可选包括“commons.inc”)),我用'application / json'替换了内容类型。现在有效。这个问题已在Drupal 7中得到纠正。

2 个答案:

答案 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) {
        // ...
    }
}

Live example

该示例适用于最新的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”是进行解析的地方,正如我所说,现在可以正常工作。

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