在JSON中查询/搜索值

时间:2011-04-26 19:47:11

标签: javascript jquery 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}]}]})

4 个答案:

答案 0 :(得分:1)

最明确地从字符串创建JavaScript对象,但是使用合法的JSON解析工具而不是“eval()”。您可以使用jQuery,但还有其他解决方案,例如json.org提供的JSON工具,这些工具既小又简单。

一旦它是一个JavaScript对象,那么你的需求应该指导你是否需要一些查询解决方案,或者只是一个简单的编程问题。

答案 1 :(得分:1)

我认为最好的方法是jLinq:http://hugoware.net/Projects/jLinq就像在JSON上进行SQL查询一样。 它不需要jQuery。 我用它,它很棒。

答案 2 :(得分:0)

如果您已经在使用jQuery,则使用JSON.parse()或jQuery.parseJSON()从JSON字符串创建对象 - 或者只是将其作为JSON从服务器端传递。

然后,您可以遍历该对象以查找所需的记录。或者,您可以使用构建对象,以便您可以自然地从中获取数据。

答案 3 :(得分:0)

FloatLeft - 正如Dan指出的那样,如果您可以使用XPath,那么您的任务会更容易,但不需要以XML格式重写您的数据。使用DefiantJS(http://defiantjs.com),可以现在使用XPath表达式查询JSON结构。

DefiantJS使用方法“search”扩展全局对象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;