有没有JSON等同于XQuery / XPath?
在复杂的JSON数组和哈希中search项目时,如:
[ { "id": 1, "name": "One", "objects": [ { "id": 1, "name": "Response 1", "objects": [ // etc. }] } ]
有什么样的查询语言,我可以用来find一个项目in [0].objects where id = 3
?
是的,这就是所谓的JSONPath :
它也被纳入DOJO 。
我认为JSONQuery是JSONPath的超集,因此将其replace为dojo 。 那么还有RQL 。
来自Dojo文档:
JSONQuery是JSONPath的扩展版本,具有安全性,易用性和全面的数据查询工具集,包括过滤,recursionsearch,sorting,映射,范围select以及使用通配符string比较和各种运算符的灵活expression式等附加function。
JSONselect在这个问题上有另一个观点(CSSselect器,而不是XPath),并且有一个JavaScript实现 。
我知道的其他select是
- JSONiq规范,它指定了两种语言的子types:一种隐藏XML细节并提供类似于JS的语法,另一种使用JSON构造函数等丰富XQuery语法。 Zorba实现了JSONiq。
- 在MarkLogic之上构build的Corona提供了一个REST接口,用于存储,pipe理和searchXML,JSON,文本和二进制内容。
- MarkLogic 6和更高版本提供了与Corona相似的REST接口。
- MarkLogic 8和更高版本在其XQuery和服务器端JavaScript环境中本地支持JSON。 你可以在其上应用XPath。
HTH。
尝试使用JSPath
JSPath是一种特定于域的语言(DSL),使您能够在JSON文档中导航和查找数据。 使用JSPath,您可以selectJSON项目以检索它们包含的数据。
用于JSON的JSPath,如用于XML的XPath。
它针对Node.js和现代浏览器进行了大量优化。
总结一些遍历/过滤JSON数据的当前选项,并提供一些语法示例…
-
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
-
json:select() (更多受CSSselect器启发)
.automobiles .maker:val("Honda") .model
-
JSONPath (受XPath启发)
$.automobiles[?(@.maker='Honda')].model
我认为JSPath看起来最好,所以我将尝试将其与我的AngularJS + CakePHP应用程序集成。
(我最初在另一个线程中发布了这个答案,但是也认为它在这里也是有用的。)
如果处理器提供JSON支持,则可以使用XQuery来查询JSON。 这是一个简单的例子,BaseX如何用来查找“id”= 1的对象:
json:parse('[ { "id": 1, "name": "One", "objects": [ { "id": 1, "name": "Response 1", "objects": [ "etc." ] } ]} ]')//value[.//id = 1]
Json指针似乎也越来越支持。
Jsel很棒,基于真正的XPath引擎。 它允许您创buildXPathexpression式来查找任何types的JavaScript数据,而不仅仅是对象(string)。
您可以创build自定义模式和映射,使您可以完全控制XPath引擎的数据如何移动。 模式是一种定义数据中如何定义元素,子元素,属性和节点值的方法。 然后你可以创build自己的expression式来适应。
鉴于你有一个variables称为data
,其中包含从问题的JSON,你可以使用jsel写:
jsel(data).select("//*[@id=3]")
这将返回id
属性为3的任何节点。属性是对象内的任何基元(string,数字,date,正则expression式)值。
ObjectPath是一种类似于XPath或JSONPath的查询语言,但由于embedded式算术计算,比较机制和内置函数,function更加强大。 查看语法:
在商店里find所有红色和价格低于50的鞋子
$ ..鞋。* [颜色是“红”,价格<50]
Defiant.js看起来也很酷,下面是一个简单的例子:
var obj = { "car": [ {"id": 10, "color": "silver", "name": "Volvo"}, {"id": 11, "color": "red", "name": "Saab"}, {"id": 12, "color": "red", "name": "Peugeot"}, {"id": 13, "color": "yellow", "name": "Porsche"} ], "bike": [ {"id": 20, "color": "black", "name": "Cannondale"}, {"id": 21, "color": "red", "name": "Shimano"} ] }, search = JSON.search(obj, '//car[color="yellow"]/name'); console.log( search ); // ["Porsche"] var reds = JSON.search(obj, '//*[color="red"]'); for (var i=0; i<reds.length; i++) { console.log( reds[i].name ); } // Saab // Peugeot // Shimano
@Naftule – 使用“defiant.js”,可以使用XPathexpression式查询JSON结构。 看看这个评估者了解它是如何工作的:
http://www.defiantjs.com/#xpath_evaluator
与JSONPath不同,“defiant.js”为JSON结构上的XPath查询语法提供了全面的支持。
defiant.js的源代码可以在这里find:
hbi99/defiant.html
如果你像我一样,你只是想做基于path的查找,但不关心真正的XPath,lodash的_.get()
可以工作。 lodash文档示例:
var object = { 'a': [{ 'b': { 'c': 3 } }] }; _.get(object, 'a[0].b.c'); // → 3 _.get(object, ['a', '0', 'b', 'c']); // → 3 _.get(object, 'abc', 'default'); // → 'default'
试试这个 – https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
这是一个非常简单的实现在xml的xpath的类似的行上。 它的名字是jpath。