有没有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是

  1. JSONiq规范,它指定了两种语言的子types:一种隐藏XML细节并提供类似于JS的语法,另一种使用JSON构造函数等丰富XQuery语法。 Zorba实现了JSONiq。
  2. 在MarkLogic之上构build的Corona提供了一个REST接口,用于存储,pipe理和searchXML,JSON,文本和二进制内容。
  3. MarkLogic 6和更高版本提供了与Corona相似的REST接口。
  4. 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。