是否有与XQuery / XPath等效的JSON?

2020/10/13 12:01 · javascript ·  · 0评论

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

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

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

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

它还集成到DOJO中

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

从Dojo文档中:

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

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

总结一些当前的遍历/过滤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应用程序集成。

(我最初将此答案发布在另一个线程中,但也认为在这里也很有用。)

我知道的其他替代方法是

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

HTH。

尝试使用JSPath

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

JSON的JSPath,例如XML的XPath。

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

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

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

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

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

... [哪个]我可以用来在[0] .ids = 3的对象中找到一个项目?

我假设这意味着:无论对象位于何处,都在id == 3的指定键下找到所有JSON对象。相应的jq查询为:

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

其中“ |” 是管道运算符(如在命令外壳管道中一样),并且段“ .. | object”对应于“不管对象可能在哪里”。

jq的基础知识在很大程度上是显而易见的,直观的,或者至少是相当简单的,如果您完全熟悉命令外壳程序管道,那么其余大多数就很容易理解。jq FAQ具有指向教程等的指针。

jq也类似于SQL,因为它支持CRUD操作,尽管jq处理器从不覆盖其输入。jq还可以处理JSON实体流。

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

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

Json Pointer似乎也正在获得越来越多的支持。

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

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

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

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

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

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

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

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

$ .. shoes。* [颜色为“红色”,价格<50]

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

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

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

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

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

如果您像我一样,并且只想进行基于路径的查找,但不关心真正的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'

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

这是在XML的xpath的相似行上的非常简单的实现。它的名称为jpath。

本文地址:http://javascript.askforanswer.com/shifouyouyuxquery-xpathdengxiaodejson.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇: