无法访问JSON响应属性

问题描述:

我在JavaScript中的JSON响应,看起来像这样:无法访问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是有效的,我检查了它。

EDIT

在这种情况下,服务器使用json_encode函数在PHP数组转换为JSON。我试过在最后删除分号,这仍然给我一个未定义的opt1值。我也尝试设置ajax调用的dataType,这会导致错误,表明有意想不到的字符。

+1

是否真的有分号结尾?这不是有效的JSON。你确定'console.log(data)'没有记录JSON字符串_as string_?如果你没有明确地告诉jQuery你期待JSON,它会尝试猜测响应是什么格式,并且我猜测由于你的字符串是_not_有效的JSON,它不会为你解析它,所以你不能访问属性。 – nnnnnn

+0

显示更多代码 - 您是在AJAX调用中指定dataType:“json”还是发送Content-type:application/json的服务器? – Barmar

+0

@PankajGarg:1.你指出的答案与OP概述的问题没有任何关系。 2.唠叨OP看你的答案是*不酷*在SO上。当您发布答案时,OP会收到通知。这就够了。发表评论(更不用说不必要的粗体)就不合适也不有用。 –

听起来像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(/;$/, '')); 
    

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

+0

最后的建议对我有用!尽管如此,还是不​​太明白这是如何发生的。分号甚至来自哪里?这只是一个数组,直接转换为JSON对象使用json_encode – danvdende

+0

@danvdende:我很高兴最后一个选项适合你! 'json_encode'绝对不会放分号,所以我想在PHP文件中必须有一些杂散输出进一步下载...? –

+0

我检查了整个文件,那里没有其他回声......这确实很奇怪 – danvdende

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

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

您需要'$ .parseJSON(data)',而不是'data.toJSON()'。 – moonwave99

+0

更改为parseJSON ...我从http://www.w3schools.com/jsref/jsref_tojson.asp得到了JSON,但意识到这只是一种Date方法。 –

+0

尝试了$ .parseJSON(data),这给了我未捕获的SyntaxError:意外的标记; – danvdende

,使用本地通话

json = JSON.parse(data); 

或使AJAX的参数作为这样JSON ..

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

在吨他的情况下,你的回复会自动转换为json

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