引子
如何对拿到的json数据进行搜索和查询呢?前面我的一篇博客中已经提到了JsonSQL,请看 http://www.haorooms.com/post/jquery_ajax_wg 这几天用了一下,说说方法和感受吧~~
json数据查询的方法
网上看到有一篇帖子,有8种json数据查询的方法,大家可以研究一下,我现在分享一下!
JsonSQL
JsonSQL实现了使用SQL select语句在json数据结构中查询的功能。
例子:
$.getJSON("testjson.js", function(a){
console.dir(jsonsql.query("select * from json.channel.items order by title desc,json",a));
});
主页: http://www.trentrichardson.com/jsonsql/
JSONPath
JSONPath就像是针对JSON数据结构的XPath。
例子:
jsonPath( books, '$..book[(@.length-1)]')
主页:http://goessner.net/articles/JsonPath/
jfunk
jFunk允许你检索(很快会加入管理功能)复杂的JSON或Javascript对象。jFunk API的设计几乎与jQuery API类似。它直接复制了jQuery的API,除了那些针对DOM的API。
例子:
jF("*[color=Orange]",Food).get();
jF("> vegetables > *[color=Orange]",Food).get();
主页:http://code.google.com/p/jfunk/
TaffyDB
你过去有没有注意到Javascript对象的字面值看起来很像记录?如果你把他们包裹在一个数组里面,那么它们看起来有没有像一个数据库表?TaffyDB是一个Javascript库,它提供了强大的数据库功能以实现之前的想法,大大改善了你在Javascript中使用数据的方式。
var kelly = friends({id:2}).first();
linq.js
linq.js——Javascript中的LINQ(译者注:.Net中的概念,见http://msdn.microsoft.com/zh-tw/library/bb397897)
var queryResult2 = Enumerable.From(jsonArray)
.Where("$.user.id < 200")
.OrderBy("$.user.screen_name")
.Select("$.user.screen_name + ':' + $.text")
.ToArray();
主页1:http://linqjs.codeplex.com/
主页2:http://neue.cc/reference.htm
objeq
objeq是一个简单的库,实现了对POJSO(Plain-Old JavaScript Objects,普通的Javascript对象)的实时查询。
var res = $objeq(data, "age > 40 && gender == 'female' -> name");
// --> Returns ['Jessica']
主页:https://github.com/agilosoftware/objeq
(译注:它使用了Javascript的property setters,所以它只能工作在较新的浏览器上)
json:select()
使用类CSS选择符来查询JSON。
.lang:val("Bulgarian") ~ .level
主页:http://jsonselect.org/#tryit
Paul的编程珠玑中的Javascript数组过滤方法
var a = [1,2,3,4,5,6,7,8,9,10];
// return everything
a.where( "( ) => true" ) ;
// --> [1,2,3,4,5,6,7,8,9,10]
// return even numbers
a.where( "( n, i ) => n % 2 == 0" ) ;
// --> [2,4,6,8,10]
// query first 6 products whose category begins with 'con' using extra param and regular expression
products.where( "( el, i, res, param ) => res.length <= 6 && param.test( el.cat )", /^con/i);
// using customer table data from SQL Server's northwind database...
customers.where( "( el, i, res, param ) => el.country == param", "USA" );
主页:http://www.paulfree.com/28/javascript-array-filtering/#more-28
json查询 项目背景和应用
项目背景
做一个微信项目,需要对返回的json数据进行搜索和查询,查询是模糊查询,json数据结构比较复杂。
应用
我一开始用的是JsonSQL,可以进行简单的json数据查询,比较方便,但是用起来发现JsonSQL查询的json数据结构比较简单,对于复杂的,嵌套很多的数据,用起来不是很方便。因此,对于JsonSQL,我最后没有用它。
JsonSQL的应用:
function getAll(){
$.getJSON("testjson.js", function(a){
console.dir(jsonsql.query("select * from json.channel.items order by title desc,json",a));
});
}
function getFiltered(){
$.getJSON("testjson.js", function(json){
console.dir(jsonsql.query("select title,url,author,category from json.channel.items where (category=='javascript' || author=='trent') order by title,category asc limit 3",json));
});
}
function getLimit(){
$.getJSON("testjson.js", function(json){
console.dir(jsonsql.query("select url from json.channel.items where (category=='javascript' && author=='trent') order by url asc limit 1,2",json));
});
}
引进的是如下2个文件。
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript" src="jsonsql-0.1.js"></script>
testjson.js的结构是
{
"channel": {
"title": "Trent's Blog",
"link": "http://www.haorooms.com/",
"description": "practical programming",
"published": "Fri, 28 Dec 20014 04:27:29 +0000",
"language": "en",
"items": [{
"title": "Are You Using Regular Expressions Within SQL?",
"url": "http://www.haorooms.com/?p=45",
"published": "Fri, 28 Dec 2014 02:32:31 +0000",
"author": "trent",
"category": "programming",
"guid": {
"isPermaLink": false,
"url": "http://www.haorooms.com/?p=45"
},
"description": "Are You Using Regular Expressions Within SQL?Are You Using Regular Expressions Within SQL?Are You Using Regular Expressions Within SQL?"
},{
"title": "Nothing Better than a Good Dump!",
"url": "http://www.haorooms.com/?p=44",
"published": "Mon, 24 Dec 2013 02:54:39 +0000",
"author": "trent",
"category": "javascript",
"guid": {
"isPermaLink": false,
"url": "http://www.haorooms.com/?p=44"
},
"description": "Nothing Better than a Good Dump!Nothing Better than a Good Dump!Nothing Better than a Good Dump!Nothing Better than a Good Dump!Nothing Better than a Good Dump!"
}]
}
}
JsonSQL对这种简单的数据结构,查询起来比较方便。注意:jsonSQL的代码得知:
parse: function(json,ops){
var o = { fields:["*"], from:"json", where:"", orderby:[], order: "asc", limit:[] };
for(i in ops) o[i] = ops[i];
var result = [];
result = this.returnFilter(json,o);
result = this.returnOrderBy(result,o.orderby,o.order);
result = this.returnLimit(result,o.limit);
return result;
},
JsonSQl只支持简单的SQL查询,例如where,orderBy,order,且where只能跟“==”不能进行模糊查询!不能用like,否则会出错!!!
另外,JsonSQl的键值key只能是英文,不能有中文,否则会出错!!!
jfunk的应用:
可以对比较复杂的数据结构进行操作
var Food={
fruits: [
{ name: "Banana", color: "Yellow" },
{ name: "Apple", color: "Red" },
{ name: "Grapefruit", color: "Orange" },
{ name: "Kiwi", color: "Green" }
],
vegetables: [
{ name: "Carrot", color: "Orange" },
{ name: "Turnip", color: "Purple" },
{ name: "Rutabaga", color: "Yellow" },
{ name: "Sweet Potato", color: "Orange" }
]
};
var orangeStuff=jF("*[color=Orange]",Food).get();
var orangeVeg =jF("> vegetables > *[color=Orange]",Food).get();
//orange stuff is now [{name:"Grapefruit",color:"Orange"},{name:"Carrot",color:"Orange"},{name:"Sweet Potato",color:"Orange"}]
//orange veg is now [{name:"Carrot",color:"Orange"},{name:"Sweet Potato",color:"Orange"}]
项目应用
因为我的数据很复杂,最后我选用的是jfunk,但是我没有完全运用jfunk,我只是用jF("> vegetables > *[color]",Food).get();这种方法,查询到了vegetables 子类中的所有color,并对color的某些属性,循环判断,模糊查询属性中有没有某个值,然后把查询到的结果push到了新的数组当中。这样完成的搜索结果。