【问题标题】:Cannot access JSON response attribute无法访问 JSON 响应属性
【发布时间】:2013-05-16 19:59:48
【问题描述】:

我在 JavaScript 中有一个如下所示的 JSON 响应:

{"opt1":"2.92","opt2":"4.24","opt3":"6.36"};

这是应用console.log(data) 的结果,其中数据是响应:

success: function(data){
            console.log("Ajax succeeded");
            console.log(data);
            console.log(data.opt1);
        },

但是,我无法访问 opt1 的值。控制台指示未定义。任何想法为什么会这样? JSON 是有效的,我检查过了。

编辑

本例中的服务器使用 PHP 中的 json_encode 函数将数组转换为 JSON。我已经尝试删除最后的分号,这仍然给我一个未定义的 opt1 值。我也试过设置ajax调用的dataType,结果报错,提示有意外字符。

【问题讨论】:

  • 最后真的有分号吗?那不是有效的 JSON。您确定 console.log(data) 没有将 JSON 字符串 记录为字符串 吗?如果您没有明确告诉 jQuery 您期待 JSON,它会尝试猜测响应是什么格式,我猜由于您的字符串是 not 有效的 JSON,它不会为您解析它所以你不能访问属性。
  • 显示更多代码 -- 您是在 AJAX 调用中指定 dataType: "json",还是服务器发送 Content-type: application/json
  • @PankajGarg:1.您指向的答案与OP概述的问题无关。 2. 唠叨 OP 看你的答案在 SO 上 不酷。当您发布答案时,OP 会收到通知。这已经足够了。发表评论(更不用说不必要的粗体评论了)既不合适也无用。

标签: ajax json jquery


【解决方案1】:

听起来data实际上可能是一个字符串,而不是一个对象。

你需要做的两件事:

首先:如果该分号确实存在,则您得到的响应不是有效的 JSON。您需要通过删除分号服务器端来解决这个问题。 (但见下文。)

第二:然后,您需要确保将 JSON 字符串反序列化为一个对象。有几种方法可以做到这一点:

  1. 如果您的服务器使用正确的 Content-Type 标头 (application/json) 回复,它将自动发生。这是最好的方法。

  2. 如果由于某种原因并非如此,并且您无法做到这一点,请将 dataType: 'json' 添加到您的 ajax 通话中。

  3. 如果由于某种原因你不能这样做,你可以通过$.parseJSON手动解析JSON字符串,例如:

    data = $.parseJSON(data);
    

    (请注意,parseJSON 会很乐意使用浏览器内置的JSON.parse,如果有的话。如果浏览器没有,jQuery 会使用自己的。)


如果由于某种原因您无法删除无效的; 服务器端,您可以解决它:

  1. dataType: 'text' 添加到您的ajax 通话中

  2. success:

    data = $.parseJSON(data.replace(/;$/, ''));
    

    如果存在分号,它将删除分号,然后解析结果。

【讨论】:

  • 最后一个建议对我有用!仍然不太明白这是怎么发生的。分号是从哪里来的?它只是一个使用 json_encode 直接转换为 JSON 对象的数组
  • @danvdende:我很高兴最后一个选项对你有用! json_encode 绝对没有加分号,所以我认为在附加它的 PHP 文件中一定有一些杂散输出......?
  • 我检查了整个文件,那里没有其他回声……确实很奇怪
【解决方案2】:

这可能是由于您的响应以字符串形式从服务器返回(我遇到了同样的问题)...尝试:

success: function(data){
     var json = $.parseJSON(data);
     console.log("Ajax succeeded");
     console.log(json);
     console.log(json.opt1);
},

【讨论】:

  • 你需要$.parseJSON(data),而不是data.toJSON()
  • 改为 parseJSON...我从w3schools.com/jsref/jsref_tojson.asp 得到 toJSON,但意识到这只是一个 Date 方法。
  • 试过 $.parseJSON(data),这给了我 Uncaught SyntaxError: Unexpected token ;
  • 我猜这与结尾分号不解析有关 - 你可以删除它并尝试解析吗?
  • 因此,我注意到的错误。
【解决方案3】:

试试jQuery.parseJSON(obj)

jQuery.parseJSON() Takes a well-formed JSON string and returns the resulting JavaScript object.

这样使用:

var str = '{"opt1":"2.92","opt2":"4.24","opt3":"6.36"}';
var obj = jQuery.parseJSON(str);
console.log(obj.opt1);

【讨论】:

    【解决方案4】:

    使用本地调用

    json = JSON.parse(data);
    

    或者把ajax的参数做成json这样..

    $.ajax({
      url : blahblah,
      dataType : 'json',
      .....
    });
    

    在这种情况下,您的响应会自动转换为 json

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多