对于我正在创建的网站,我必须根据从服务器提供的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 :(得分: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;