是否有JSON等效的XQuery/XPath?

Naf*_*Kay 213 javascript xpath json xquery

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

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]
Run Code Online (Sandbox Code Playgroud)

我可以用某种查询语言来查找项目in [0].objects where id = 3吗?

Mik*_*sen 118

是的,它被称为JSONPath.源代码现在在GitHub上.

它也被整合到DOJO中.

  • 这有多坚固?而且我找不到Java或C#版本对我们来说是一个交易杀手. (5认同)
  • Brian的回答表明jsonQuery模块应该在dojo中使用[而不是](http://www.sitepen.com/blog/2008/07/16/jsonquery-data-querying-beyond-jsonpath/)jsonPath模块. (3认同)
  • 这里链接的网站提供Javascript和PHP.如果您需要Java实现,可以在这里找到一个:http://code.google.com/p/json-path/ (2认同)
  • 我应该提到JSONPath不是基于XPath正式语义.JSONiq可能是更好的选择. (2认同)

Bri*_*zel 21

我认为JSONQuery是JSONPath的超集,因此在dojo中替换它.然后还有RQL.

从Dojo文档:

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

JSONselect在这个问题上有另一种观点(类似于CSS选择器,而不是XPath),并且有一个JavaScript实现.

  • github JSONQuery链接似乎已经死了.JSONSelect现在也有一个JavaScript版本. (4认同)

grt*_*tjn 19

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

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

HTH.

  • 现在有一个JSONiq实现:Zorba 2.6正式支持它. (3认同)

Sim*_*ast 18

总结一些用于遍历/过滤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应用程序集成.

(我最初在另一个帖子中发布了这个答案但是认为它在这里也很有用.)


小智 13

尝试使用JSPath

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

用于JSON的JSPath类似于XPath for XML.

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


Chr*_*rün 9

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

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


pea*_*eak 8

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

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)
Run Code Online (Sandbox Code Playgroud)

"|" 是管道操作符(如在命令shell管道中),并且段".. | objects"对应于"无论对象在哪里".

JQ的基础在很大程度上是明显的或直观或至少相当简单,和其余大部分是容易的,如果你在所有熟悉命令壳管回暖.jq FAQ有指向教程等的指针.

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

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

  • 它是否支持正则表达式?(jq 1.5全面支持PCRE正则表达式)
  • 图灵完成了吗?(是)


kar*_*man 7

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


Epo*_*poc 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
Run Code Online (Sandbox Code Playgroud)


leo*_*228 7

最新的 XPath 规范包括 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] 中的新函数来支持它们。


Ela*_*rek 6

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

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

$ ..鞋子.*[颜色为"红色",价格<50]


Ali*_*Ali 6

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

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

假设您有一个名为dataJSON 的变量,您可以使用jsel来编写:

jsel(data).select("//*[@id=3]")
Run Code Online (Sandbox Code Playgroud)

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


Hak*_*gin 5

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

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

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

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


jlh*_*jlh 5

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