无法访问JSON响应属性

时间:2013-05-16 11:44:01

标签: ajax json jquery

我在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,这会导致错误,表明存在意外的字符。

4 个答案:

答案 0 :(得分:5)

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

您需要做的两件事:

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

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

  1. 如果您的服务器使用正确的Content-Type标题(application/json)回复,则会自动执行此操作。这是最好的方式。

  2. 如果出于某种原因并非如此,请将dataType: 'json'添加到ajax来电。

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

    data = $.parseJSON(data);
    

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

    < / LI>

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

    1. dataType: 'text'添加到您的ajax来电

    2. success

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

      如果它在那里会删除分号,然后解析结果。

答案 1 :(得分:0)

这可能是由于你的回复是从服务器返回的字符串(我有同样的问题)...尝试:

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

答案 2 :(得分:0)

使用原生呼叫

json = JSON.parse(data);

或将 ajax 的参数设为json,就像这样..

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

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

答案 3 :(得分:0)

尝试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);