2013-02-22 90 views
0

我想弄清楚如何访问JSON格式的数据,并已经花了一整天的时间寻找方法,但我仍然找不到解决方案来满足我的需求。对我的问题最接近的相对问题是this question,但无济于事。如何使用javascript访问JSON格式的数据

基本上我从$.ajax()检索数据,它以JSON格式返回。

[{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
{"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
{"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"}] 
[{"date":"2013-02-01","visits":63}, 
{"date":"2013-02-02","visits":30}] 

我的问题是我怎么能访问元素JSON里面,说我想“NV”或第二支架“日期”的所有值的所有值,在JavaScript?我对这些东西很陌生,所以不熟悉这些术语,对此抱歉。

下面是我的代码:

var Data = $.ajax({ 
    url: url, 
    type: 'POST', 
    dataType:"json", 
    async: false 
}).responseText; 

console.log(Data); 

网址是我的功能在里面你可能会问的情况下通过的变量。

+3

JSON表示单个对象或数组,所以不能返回两个完全独立的阵列。当你将它解析为存储在一个变量中的实际对象/数组时,它将如何工作?一个变量不能指向两个单独的东西。 – 2013-02-22 09:59:42

+0

@AnthonyGrist是对的。你的json字符串无效。检查http://jsonlint.com/ – Kris 2013-02-22 10:12:21

+0

@Kris谢谢你的链接,我想我需要重建我的json字符串。 – Darth 2013-02-22 10:14:03

回答

4

更新:请参阅Anthony Grist对您的问题的评论,我错过了您的JSON无效的事实。由于他没有发布答案,我会选择它。

JSON是无效的,因为你返回两个单独的阵列,这一个:

[{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
{"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
{"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"}] 

这一个:

[{"date":"2013-02-01","visits":63}, 
{"date":"2013-02-02","visits":30}] 

你不能这样做,因为顶层一个JSON文件必须是一个东西(一个对象或一个数组)。

您可以用属性返回的对象为每个阵列:

{ 
"vdata": 
    [{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
    {"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
    {"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"} 
    ], 
"datedata": 
    [{"date":"2013-02-01","visits":63}, 
    {"date":"2013-02-02","visits":30} 
    ] 
} 

分析(见下文)后,就可以访问这些数据是这样的:

console.log(data.vdata[0].v); // "233" 
console.log(data.datedata[0].date); // "2013-02-01" 

或被两个插槽的数组,每个插槽中都有一个阵列:

[ 
    [{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
    {"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
    {"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"} 
    ], 
    [{"date":"2013-02-01","visits":63}, 
    {"date":"2013-02-02","visits":30} 
    ] 
] 

解析后(见下文),您可以访问这些数据是这样的:

console.log(data[0][0].v); // "233" 
console.log(data[1][0].date); // "2013-02-01" 

就个人而言,我更喜欢使用对象,因为那显然我访问哪个阵列。


原来的答复:

jQuery将解析JSON到你的一个对象,并传递到success功能,然后你就可以访问就像任何其他对象。在你的情况下,顶层是一个数组。所以:

$.ajax({ 
    url: url, 
    type: 'POST', 
    dataType:"json", 
    async: false, 
    success: function(data) { 
     // Use the line from above that suits the way 
     // you updated your JSON structure 
    } 
}); 

旁注:async: false已取消,将在某个时候被移除。做同步ajax请求通常不是一个好主意,它往往会在请求期间锁定浏览器的用户界面。相反,只需构造代码以在触发回调时继续处理。

+0

感谢@Crowder回答,但出于某种奇怪的原因,日志中没有显示任何数据。我尝试在'success'回调下设置一个简单的'alert()'函数来检查,但即使这样也没有触发。有关如何解决问题的任何想法? – Darth 2013-02-22 09:43:08

+1

@达思:我从你的问题中想过你已经成功地看到JSON回来了,但听起来你并不是。这表明您正在进行跨域调用,并被[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)阻止,该域禁止跨源呼叫。如果另一端支持它,您可以切换到使用绕过SOP的[JSONP](http://en.wikipedia.org/wiki/JSONP#JSONP),或者(如果源再次支持它)[ CORS](http://www.w3.org/TR/access-control/)。但CORS还需要浏览器支持。 – 2013-02-22 09:53:51

+0

@Crowder是的我可以用'console.log(Data)'在奇怪的日志中显示返回的JSON。 – Darth 2013-02-22 09:59:54

1

如果我理解你的问题,你需要访问这个数组中所有对象的相同密钥。

没有直接的方法来做到这一点,你必须遍历数组中的所有对象,然后在每个对象中找到所需的键。

JSON.parse()来将这个字符串转换成JavaScript对象(JSON)

var myData = JSON.parse(Data); 

for(var i = 0; i < myData.length; i++) { 
    console.log("This is the nv value of the " + i + " object: " + myData[i].nv); 
} 
+0

是的没错,我需要为所有对象访问相同的密钥。 但下面的代码给了我这个错误: '语法错误:JSON.parse:意外character' 'VAR MYDATA的= JSON.parse(数据);' – Darth 2013-02-22 09:52:47

+0

@Darth:''
在你的错误信息或者是部分的错误?我认为这不是错误的一部分,所以也许你的数据变量中没有数据。您可以尝试使用'error'回调或'complete'回调来查找此处发生的事情,而不是'成功'回调。 – mrleone 2013-02-22 10:01:46

+0

'
'不是我的错误信息的一部分,刚才我的评论搞砸了。感谢'错误'和'完成'回调,将检查。 – Darth 2013-02-22 10:10:54