2010-12-12 101 views
6

我創建了一個使用jQuery 1.4.2的ajax應用程序,並試過使用get(),post()和ajax()方法本身。我的PHP服務回報:從jquery訪問json數據

[{"k":"label0","v":0.5},{"k":"label1","v":99.43},{"k":"label2","v":2.46},{"k":"label3","v":46.29},{"status":"OK"}] 
在我成功的回調

我試圖訪問的json.status和JSON [0] [0] 但它總是返回 「未定義」。我究竟做錯了什麼?

function getSysinfo(source) { 
    var json = null; 
    $.ajax({ 
     url: source, 
     type: 'POST', 
     dataType: 'json', 
     success: function (data) { 
      json = eval("(" + data + ")"); 
      $('#data').html(json.status); 
      alert(json[0][0]); 
      refreshChart(json); 
     }, 
     error: function (request, status, error) { 
      alert("REQUEST:\t" + request + "\nSTATUS:\t" + status + 
        "\nERROR:\t" + error); 
     } 
    }); 
    return json; 
} 

我一直在谷歌搜索這幾天。我該如何訪問返回的數據?任何幫助,將不勝感激。

+0

我給出了一些答案,可以在你的情況下使用,已經有方法availbe喜歡的getJSON這需要照顧所有的問題,你可以循環通過 – kobe 2010-12-12 22:53:43

回答

6

要訪問狀態值,你將需要:

data[4].status 

這是因爲它是存儲在第五元素的對象在一個數組中,status是該對象上的一個屬性。

+0

啊 - 這樣做更有意義......我並不十分關心狀態元素。我需要k/v對。我真的只是在嘗試...而且我在想數據[1] .v和數據[1] [1]是同義詞。感謝名單。 – WWWIZARDS 2010-12-13 00:26:35

5

在你成功回調嘗試:

var parsed = $.parseJSON(data); 
$.each(parsed, function (i, jsondata) { 
    alert(jsondata.k); 
    alert(jsondata.v); 
}); 
+0

@lorezo,我們必須遍歷所有的元素? .k和.v給出了什麼? – kobe 2010-12-12 22:49:11

+0

@gov:你是對的!我錯過了循環部分。編輯答案反映這 – Lorenzo 2010-12-12 22:52:02

+0

你不需要像這樣解析json,jQuery已經解析了它。 – andynormancx 2010-12-12 22:53:24

4

你不需要eval("("+data+")");

「JSON」:因爲你指定dataType:'json'

從jQuery文檔進行的dataType的jQuery會自動解析爲您的JSON響應評估響應爲JSON並返回一個JavaScript對象。在jQuery 1.4中,JSON數據以嚴格的方式進行解析;任何格式不正確的JSON都會被拒絕並引發解析錯誤。 (有關正確的JSON格式的詳細信息,請參閱json.org。)

+1

NO。壞。 'JSON.parse()來'。不要爲JSON使用'eval'。壞。 – mattbasta 2010-12-12 22:45:57

+2

我不主張使用eval。我只是說他不需要它。所有瀏覽器(尤其是較老的瀏覽器)都不支持JSON.parse。使用諸如$ .parseJSON這樣的基於瀏覽器做出明智決定的東​​西可能會更好。 – nategood 2010-12-12 22:50:36

+0

我同意eval()的一部分,我只是不確定發生了什麼。我在Google上搜索的一些內容來自幾年前。我已經知道jQuery 1.4已經內置了,所以我只需要它,如果我的流類型='文本'..但我會看看更多parseJSON()。 – WWWIZARDS 2010-12-13 00:20:42

2

無需使用eval再使用如下代碼,可以更對JSON

$.getJSON(url+query,function(json){ 
      $.each(json,function(i,value){ 

      }); 
     }); 
+0

這是不需要的,問題中的代碼已經完美地解析了json。另外$ .getJSON只能用於GET請求,而不是POST,因爲問題正在使用。 – andynormancx 2010-12-12 22:58:31

+0

是的,我需要POST&ajax()也提供了更多的選擇靈活性。感謝您的回覆,雖然... – WWWIZARDS 2010-12-13 00:13:08

0

nategood已經寫道,你不」不需要對數據做任何事情,它已經是一個對象。

在這種情況下,它是一個數組,如果你想訪問狀態,你需要從數據陣列的最後一個項目檢索(也就是你會在這個數組中找到它):

data[data.length-1].status 

但也許你應該考慮你的JSON的另一個結構,它看起來不太舒服。

類似的東西:

{ 
"items":[ 
     {"k":"label0","v":0.5}, 
     {"k":"label1","v":99.43}, 
     {"k":"label2","v":2.46}, 
     {"k":"label3","v":46.29} 
     ], 
"status":"OK" 
} 

...應該是比較容易處理,因爲你可以簡單地訪問data.status而不是首先尋找在那裏你會發現它的響應裏面(什麼可能是無差錯容易)。

+0

我並不關心狀態,但k/v對...我想也許這是需要響應觸發解析。我試圖把它弄到類似於你的結構,但無意中做了,array_push($ jsonData,array(「status」=>'OK')); - 在PHP方面。無論如何,我需要命名才能正確訪問陣列... – WWWIZARDS 2010-12-13 00:06:11

+0

儘管我非常感謝您的幫助。 – WWWIZARDS 2010-12-13 00:14:15

7

你的JSON數據是這樣的:

[ 
    { 
     "k": "label0", 
     "v": 0.5 
    }, 
    { 
     "k": "label1", 
     "v": 99.43 
    }, 
    { 
     "k": "label2", 
     "v": 2.46 
    }, 
    { 
     "k": "label3", 
     "v": 46.29 
    }, 
    { 
     "status": "OK" 
    } 
] 

你將不得不使用

json[4].status 

4作爲一個神奇的數字或length-1看你的狀態 - 不可取。我會考慮修改您的服務器響應這樣更有用的東西:

{ 
    "status": "OK", 
    "entries": [ ... ] // add your data here 
}