【问题标题】:need help with an odd json parsing issue需要帮助解决奇怪的 json 解析问题
【发布时间】:2011-06-13 15:48:21
【问题描述】:

我在解析从 ajax 调用(使用 jQuery 1.4.4)返回的格式正确的 json 时遇到了奇怪的问题。奇怪的是,在我的开发服务器上它工作正常但在线失败。

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) BUT 会在console.log 中显示该对象。

非常感谢您的想法

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

【问题讨论】:

  • @T.J.克劳德:谢谢你的回复。
  • 使用 jsonviewer.stack.hu 可能有助于更好地了解您的数据。

标签: javascript jquery json jquery-1.4


【解决方案1】:

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

【讨论】:

  • 其实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." } } }'否则就是对象字面量
  • 甚至"{ \"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.\" } } }" 这将是大多数服务器端语言生成序列化的方式
  • @Martin:不,JSON 不是字符串。它是一种文本数据格式。 (而且我没有说它是文字;我说他引用的示例包含 JavaScript 文字。)如果您在语言的字符串文字中指定 JSON 文本,则只需将其放在引号中。当它是它自己的资源时(例如 HTTP 响应的正文)。不仅不想要引号,如果你把它放在引号中,它将是无效的。
  • @TJ:由于他使用 jQuery 来获取它,我可能错误地认为他希望 jQuery 解析它并以可用的方式将其传递给他的成功处理程序 - 除非他将它作为字符串返回,这不会发生,但我肯定会误解他的意图。
  • @Martin:我的意思是,如果您希望 jQuery 获取、解析并以有用的方式将其传递给success 处理程序。请参阅linked examplethe data it retrieves。 (这些都是链接;愚蠢的所以没有下划线链接。)一个几乎从不实际上将 JSON 包裹在引号中,除非在程序源代码(客户端或服务器端)中混合 JSON 编码的数据.
【解决方案2】:

在我解决了问题后查看我的更新。我很抱歉在我的原始帖子中没有更具体。变量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”是解析发生的地方,正如我所说,现在可以工作了。

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

【讨论】:

  • 很高兴你知道了!最好的,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多