2013-02-22 55 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