2011-04-26 131 views
0

對於我創建的網站,我必須根據從服務器以JSON字符串提供的數據創建報價。我一直在瀏覽這個網站(和其他各種網站),但仍然不確定查詢/搜索數據的最佳方式。查詢/搜索JSON內的值

例如,我需要從區域ID中獲取區域名稱。我需要得到一個地區的最大年齡,以及給定最小/最大年齡的價格。

我也想得到一個價格數組。

是否最好使用eval方法從字符串中創建Javascript對象?或者我應該使用jQuery。

感謝您的幫助。

({"SkiPass":[{"Id":1,"Area":"Chamonix","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":2.5},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":5.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":6.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":7.4}]}, 

{"Id":2,"Area":"Megeve","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":1},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":2.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":2.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":4.4}]}, 

{"Id":3,"Area":"Verbier","Rates":[{"Id":1,"AgeMin":0,"AgeMax":2,"Price":1.5},{"Id":2,"AgeMin":3,"AgeMax":17,"Price":3.0},{"Id":3,"AgeMin":18,"AgeMax":30,"Price":4.2},{"Id":4,"AgeMin":31,"AgeMax":59,"Price":5.4}]}]}) 
+0

聽起來像你想的XPath等效JSON。你的數據可以作爲XML獲得嗎? – Dan 2011-04-26 19:49:41

+0

@丹 - 請參閱下面的回覆。有了這個JS庫,它現在可以用XPath查詢JSON結構 – 2014-01-08 05:11:26

回答

1

從字符串創建一個JavaScript對象,絕對是這樣,但是用合法的JSON解析工具而不是「eval()」來完成。你可能使用jQuery,但還有其他的解決方案,如json.org的JSON工具,它們很小很簡單。

一旦它是一個JavaScript對象,那麼您的需求應該引導您是否需要某個查詢解決方案,或者它只是一個簡單的編程問題。

1

我認爲最好的方法是jLinq:http://hugoware.net/Projects/jLinq這就像在JSON上做一個SQL查詢一樣。 它不需要jQuery。 我使用它,它很棒。

+0

我想通過使用for語句迭代對象可以找到我需要的信息。這會比使用jLinq更快/更慢嗎? – FloatLeft 2011-04-26 20:00:31

0

如果您已經使用jQuery,或者只是從服務器端將其作爲JSON傳遞,請使用JSON.parse()或jQuery.parseJSON()從JSON字符串創建對象。

然後,您可以遍歷該對象來查找所需的記錄。或者,您可以使用構建您的對象,以便您可以自然地從中獲取數據。

+0

我已經在頁面上大量使用jQuery,所以它很有意義。然而,以下似乎不起作用: var skiPasses = jQuery.parseJSON({「SkiPass」:[{「Id」:1,「Area」:「Chamonix」,「Rates」:[{「Id」: 1, 「AgeMin」:0 「AgeMax」:2 「價格」:2.5},{ 「ID」:2 「AgeMin」:3 「AgeMax」:17, 「價格」:5.0},{「ID 「:3」,AgeMin 「:18,」 AgeMax 「:30,」 價格「:6。2},{ 「ID」:4 「AgeMin」:31, 「AgeMax」:59, 「價格」:7.4}]},{ 「ID」:3, 「區域」: 「韋爾比耶」, 「價格」: [{ 「ID」:1, 「AgeMin」:0 「AgeMax」:2 「價格」:1.5},{ 「ID」:2 「AgeMin」:3 「AgeMax」:17, 「價格」: 3.0},{ 「ID」:3 「AgeMin」:18, 「AgeMax」:30, 「價格」:4.2},{ 「ID」:4 「AgeMin」:31, 「AgeMax」:59,「價格「:5.4}]}]}) – FloatLeft 2011-04-27 09:14:37

+1

因爲你用一個對象調用它。你需要用一個字符串來調用它,因此parseJSON(「{'name':'Aviv'}」)可以工作,但parseJSON({'name':'Aviv'})不會。 – aviv 2011-04-27 11:38:08

0

FloatLeft - 正如丹指出的那樣,如果您可以使用XPath,但您不需要以XML格式重新編寫數據,那麼您的任務將會輕鬆得多。使用DefiantJS(http://defiantjs.com)您可以可以現在使用XPath表達式查詢JSON結構。

DefiantJS使用「搜索」方法擴展全局對象JSON,該方法啓用XPath查詢並返回帶有匹配項的數組(如果未找到匹配項,則返回數組)。返回的數組也配有聚合函數;其中一個「sortDesc」。

看看這個工作小提琴;
http://jsfiddle.net/hbi99/H3PR3/

var data = { 
    "SkiPass": [ 
     ... 
     { 
     "Id": 3, 
     "Area": "Verbier", 
     "Rates": [ 
      { "Id": 1, "AgeMin": 0, "AgeMax": 2, "Price": 1.5 }, 
      { "Id": 2, "AgeMin": 3, "AgeMax": 17, "Price": 3 }, 
      { "Id": 3, "AgeMin": 18, "AgeMax": 30, "Price": 4.2 }, 
      { "Id": 4, "AgeMin": 31, "AgeMax": 59, "Price": 5.4 } 
     ] 
    } 
    ] 
}, 
res1 = JSON.search(data, '//SkiPass[Id=3]/Area'), 
res2 = JSON.search(data, '//*[Area and Id=3]/Rates') 
      .sortDesc('AgeMax'); // <-- sorting descending by the value of "AgeMax" 

document.getElementById('name').innerHTML = res1; 

document.getElementById('max_age').innerHTML = res2[0].AgeMax; 
document.getElementById('price').innerHTML = res2[0].Price;