无法访问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,这会导致错误,表明有意想不到的字符。
听起来像data
实际上可能是字符串,而不是一个对象。你需要
两件事要做:
首先:如果分号是真的存在,你得到的回应是无效的JSON。您需要通过删除分号服务器端来解决该问题。 (不过,见下文)。
二:那么,你要确保JSON字符串是反序列化成一个对象。几种方法可以做到这一点:
它将如果你的服务器用正确的
Content-Type
头(application/json
)回复自动发生。这是最好的方法。如果由于某种原因,情况并非如此,您可以将
dataType: 'json'
添加到您的ajax
调用中。-
如果由于某种原因,你不能做是,您可以通过手动
$.parseJSON
解析JSON字符串,如:data = $.parseJSON(data);
(注意:
parseJSON
将愉快地使用浏览器的内置JSON.parse
如果它有一个。如果浏览器不具有一个,jQuery将使用自己的)
如果由于某种原因,你不能删除无效;
服务器端,你可以解决它。
添加
dataType: 'text'
到您的通话ajax
-
在
success
:data = $.parseJSON(data.replace(/;$/, ''));
这将删除分号,如果它存在,然后解析结果。
这可能是由于你的反应回来从服务器字符串(我有同样的问题)...尝试:
success: function(data){
var json = $.parseJSON(data);
console.log("Ajax succeeded");
console.log(json);
console.log(json.opt1);
},
您需要'$ .parseJSON(data)',而不是'data.toJSON()'。 – moonwave99
更改为parseJSON ...我从http://www.w3schools.com/jsref/jsref_tojson.asp得到了JSON,但意识到这只是一种Date方法。 –
尝试了$ .parseJSON(data),这给了我未捕获的SyntaxError:意外的标记; – danvdende
,使用本地通话
json = JSON.parse(data);
或使AJAX的参数作为这样JSON ..
$.ajax({
url : blahblah,
dataType : 'json',
.....
});
在吨他的情况下,你的回复会自动转换为json
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);
是否真的有分号结尾?这不是有效的JSON。你确定'console.log(data)'没有记录JSON字符串_as string_?如果你没有明确地告诉jQuery你期待JSON,它会尝试猜测响应是什么格式,并且我猜测由于你的字符串是_not_有效的JSON,它不会为你解析它,所以你不能访问属性。 – nnnnnn
显示更多代码 - 您是在AJAX调用中指定dataType:“json”还是发送Content-type:application/json的服务器? – Barmar
@PankajGarg:1.你指出的答案与OP概述的问题没有任何关系。 2.唠叨OP看你的答案是*不酷*在SO上。当您发布答案时,OP会收到通知。这就够了。发表评论(更不用说不必要的粗体)就不合适也不有用。 –