Ajax 无法访问JSON响应属性

Ajax 无法访问JSON响应属性,ajax,json,jquery,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);

我在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调用的数据类型,这会导致一个错误,表明存在意外字符。

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


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

使用本机呼叫

json = JSON.parse(data);
或者将ajax的参数设置为json,如下所示

$.ajax({
  url : blahblah,
  dataType : 'json',
  .....
});
在这种情况下,您的响应会自动转换为json,使用本机调用

json = JSON.parse(data);
或者将ajax的参数设置为json,如下所示

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

在这种情况下,您的响应会自动转换为json,听起来好像数据实际上可能是字符串,而不是对象

你需要做两件事:

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

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

  • 如果服务器使用正确的
    内容类型
    标题(
    application/json
    )进行回复,则会自动执行此操作。这是最好的办法

  • 如果由于某种原因,情况并非如此,而您无法做到这一点,请在
    ajax
    调用中添加
    dataType:'json'

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

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


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

  • ajax
    调用添加
    dataType:'text'

  • 成功中

    data = $.parseJSON(data.replace(/;$/, ''));
    
    这将删除分号(如果有),然后解析结果


  • 听起来好像数据实际上可能是一个字符串,而不是一个对象

    你需要做两件事:

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

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

  • 如果服务器使用正确的
    内容类型
    标题(
    application/json
    )进行回复,则会自动执行此操作。这是最好的办法

  • 如果由于某种原因,情况并非如此,而您无法做到这一点,请在
    ajax
    调用中添加
    dataType:'json'

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

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


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

  • ajax
    调用添加
    dataType:'text'

  • 成功中

    data = $.parseJSON(data.replace(/;$/, ''));
    
    这将删除分号(如果有),然后解析结果

  • 试试看

    以这种方式使用它:

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

    以这种方式使用它:

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

    它的结尾真的有分号吗?这不是有效的JSON。您确定
    console.log(data)
    没有将JSON字符串记录为字符串吗?如果您没有明确告诉jQuery您期望的是JSON,它会尝试猜测响应的格式,我猜因为您的字符串不是有效的JSON,所以它不会为您解析它,因此您无法访问属性。显示更多代码——您是否在AJAX调用中指定了
    数据类型:“JSON”
    ,或者服务器正在发送
    内容类型:application/json
    ?@PankajGarg:1。你所指的答案与OP概述的问题无关。2.因此,唠叨OP看你的答案是不酷的。当你发布你的答案时,OP收到了通知。这就足够了。发表评论(更不用说不必要的粗体评论)既不恰当也不有用。它的结尾真的有分号吗?这不是有效的JSON。您确定
    console.log(data)
    没有将JSON字符串记录为字符串吗?如果您没有明确告诉jQuery您期望的是JSON,它会尝试猜测响应的格式,我猜因为您的字符串不是有效的JSON,所以它不会为您解析它,因此您无法访问属性。显示更多代码——您是否在AJAX调用中指定了
    数据类型:“JSON”
    ,或者服务器正在发送
    内容类型:application/json
    ?@PankajGarg:1。你所指的答案与OP概述的问题无关。2.因此,唠叨OP看你的答案是不酷的。当你发布你的答案时,OP收到了通知。这就足够了。发布评论(更不用说不必要的粗体)既不合适也不有用。您需要
    $.parseJSON(data)
    ,而不是
    data.toJSON()
    。更改为parseJSON。。。我是从那里得到的,但我意识到