是否有JSON等效的XQuery / XPath?

时间:2011-12-12 21:50:35

标签: javascript json xpath xquery

在复杂的JSON数组和哈希中搜索项目时,例如:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

我是否可以使用某种查询语言来查找项in [0].objects where id = 3

18 个答案:

答案 0 :(得分:115)

是的,它被称为JSONPath。来源现在位于GitHub

它也已整合到DOJO

答案 1 :(得分:20)

我认为JSONQuery是JSONPath的超集,因而是replaces it in dojo。然后还有RQL

来自Dojo文档:

  

JSONQuery是JSONPath的扩展版本,具有其他功能   为了安全性,易用性和全面的数据查询   工具包括过滤,递归搜索,排序,映射,范围   选择,以及带有通配符字符串比较的灵活表达式   和各种运营商。

JSONselect对此问题有另一种观点(类似CSS选择器,而不是XPath)并且有一个JavaScript implementation

答案 2 :(得分:17)

我所知道的其他替代方案是

  1. JSONiq规范,它指定了两种语言子类型:一种隐藏XML详细信息并提供类似JS的语法,另一种使用JSON构造函数丰富XQuery语法。 Zorba实现了JSONiq。
  2. Corona构建于MarkLogic之上,提供了一个REST接口,用于存储,管理和搜索XML,JSON,文本和二进制内容。
  3. MarkLogic 6及更高版本提供了与Corona开箱即用的类似REST界面。
  4. MarkLogic 8及更高版本在XQuery和服务器端JavaScript环境中原生支持JSON。您可以在其上应用XPath。
  5. HTH。

答案 3 :(得分:16)

总结一些用于遍历/过滤JSON数据的当前选项,并提供一些语法示例......

  • JSPath
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json:select()(受CSS选择者启发更多)
    .automobiles .maker:val("Honda") .model

  • JSONPath(受XPath启发更多)
    $.automobiles[?(@.maker='Honda')].model

我认为JSPath看起来最好,所以我将尝试将它与我的AngularJS + CakePHP应用程序集成。

(我最初在another thread发布了这个答案,但认为这也很有用。)

答案 4 :(得分:13)

尝试使用JSPath

JSPath是一种特定于域的语言(DSL),使您可以在JSON文档中导航和查找数据。使用JSPath,您可以选择JSON项以检索它们包含的数据。

用于JSON的JSPath,如用于XML的XPath。

它对Node.js和现代浏览器都进行了大量优化。

答案 5 :(得分:9)

只要处理器提供JSON支持,XQuery就可用于查询JSON。这是一个简单的示例,如何使用BaseX查找“id”= 1的对象:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

答案 6 :(得分:7)

Json Pointer似乎也得到越来越多的支持。

答案 7 :(得分:7)

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

答案 8 :(得分:6)

ObjectPath是一种类似于XPath或JSONPath的查询语言,但由于嵌入式算术计算,比较机制和内置函数,功能更强大。 请参阅语法:

在店内找到所有红色鞋子,价格低于50的鞋子

$ ..鞋子。* [颜色为“红色”,价格&lt; 50]

答案 9 :(得分:6)

Jsel非常棒,基于真正的XPath引擎。它允许您创建XPath表达式以查找任何类型的JavaScript数据,而不仅仅是对象(字符串)。

您可以创建自定义架构和映射,以便完全控制XPath引擎可以如何遍历数据。模式是一种定义数据中元素,子元素,属性和节点值的定义方式。然后你可以创建自己的表达式以适应。

鉴于您有一个名为data的变量,其中包含问题中的JSON,您可以使用jsel来编写:

jsel(data).select("//*[@id=3]")

这将返回id属性为3的任何节点。属性是对象中的任何原语(字符串,数字,日期,正则表达式)。

答案 10 :(得分:5)

  

是否有某种查询语言......

jq定义了与JSONPath非常相似的 J SON q uery语言 - 请参阅https://github.com/stedolan/jq/wiki/For-JSONPath-users

  

... [我可以用来找到[0] .objects中id = 3的项目?

我假设这意味着:找到指定键下id == 3的所有JSON对象,无论对象在哪里。相应的jq查询将是:

.[0].objects | .. | objects | select(.id==3)

其中“|”是管道操作符(在命令shell管道中),并且段“.. | objects”对应于“无论对象在何处”。

jq的基础知识在很大程度上是显而易见的或直观的,或者至少非常简单,如果你完全熟悉命令shell管道,其余大部分都很容易上手。 jq FAQ有指向教程等的指针。

jq也像SQL一样,它支持CRUD操作,尽管jq处理器永远不会覆盖它的输入。 jq还可以处理JSON实体流。

在评估面向JSON的查询语言时,您可能希望考虑的另外两个标准是:

  • 是否支持正则表达式? (jq 1.5全面支持PCRE正则表达式)
  • Turing-complete? (是)

答案 11 :(得分:4)

@Naftule - 使用“defiant.js”,可以使用XPath表达式查询JSON结构。查看此评估者,了解其工作原理:

http://www.defiantjs.com/#xpath_evaluator

与JSONPath不同,“defiant.js”提供了对JSON结构上的XPath查询语法的全面支持。

defiant.js的源代码可以在这里找到:
https://github.com/hbi99/defiant.js

答案 12 :(得分:3)

JMESPath在当今(截至2020年)似乎非常流行,并且解决了JSONPath的许多问题。它适用于多种语言。

答案 13 :(得分:1)

如果你像我一样,你只想做基于路径的查找,但不关心真正的XPath,那么lodash的_.get()可以正常工作。来自lodash docs的示例:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'

答案 14 :(得分:1)

只需添加选择,这里还有XPath。 XPath 3.1处理JSON和XML。在XPath 3.1中,您需要的查询是ClassSymbol

答案 15 :(得分:0)

试试这个 - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java

对于xml,它在类似的xpath行上是一个非常简单的实现。它的名字是jpath。

答案 16 :(得分:0)

我知道OP用javascript标记了问题,但就我而言,我只是从Java后端(使用Camel)寻找完全相同的东西。

有趣的是,如果您使用的是Camel之类的集成框架,那么jsonPath也受Camel 2.13以后的特定Camel Component支持。

上面的骆驼文档中的示例:

from("queue:books.new")
  .choice()
    .when().jsonpath("$.store.book[?(@.price < 10)]")
      .to("jms:queue:book.cheap")
    .when().jsonpath("$.store.book[?(@.price < 30)]")
      .to("jms:queue:book.average")
    .otherwise()
      .to("jms:queue:book.expensive")

使用起来非常简单

答案 17 :(得分:0)

latest XPath spec 包括 JSON 支持:

<块引用>

XPath 的主要目的是寻址 XML 树和 JSON 树的节点。 XPath 因其使用路径表示法在 XML 文档的层次结构中导航而得名。 XPath 使用紧凑的非 XML 语法来促进在 URI 和 XML 属性值中使用 XPath。 XPath 3.1 添加了类似的语法来导航 JSON 树。

XQuery 也是如此:

<块引用>

JSON 是一种轻量级数据交换格式,广泛用于在网络上交换数据和将数据存储在数据库中。许多应用程序将 JSON 与 XML 和 HTML 一起使用。 XQuery 3.1 扩展了 XQuery 以支持 JSON 和 XML,向数据模型添加映射和数组,并通过语言中的新表达式和 [XQuery 和 XPath 函数和运算符 3.1] 中的新函数支持它们。