是否有(大致)SQL或类似xquery的语言来查询JSON?

我正在考虑非常小的数据集,很好地映射到JSON,它将很容易回答查询,如“X的所有值是什么,Y > 3”或做通常的SUM / COUNT类型操作。

作为一个完全虚构的例子,是这样的:

[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]

SUM(X) WHERE Y > 0     (would equate to 7)
LIST(X) WHERE Y > 0    (would equate to [3,4])

我认为这将在客户端和服务器端工作,结果将被转换为适当的特定于语言的数据结构(或者可能保留为JSON)

快速搜索一下谷歌,就会发现人们已经考虑过它并实现了一些东西(JAQL),但它似乎还没有一个标准的用法或库集出现。虽然单独实现每个功能都是相当琐碎的,但如果有人已经做对了,我就不想重新发明轮子。

有什么建议吗?

Edit: This may indeed be a bad idea or JSON may be too generic a format for what I'm thinking.. The reason for wanting a query language instead of just doing the summing/etc functions directly as needed is that I hope to build the queries dynamically based on user-input. Kinda like the argument that "we don't need SQL, we can just write the functions we need". Eventually that either gets out of hand or you end up writing your own version of SQL as you push it further and further. (Okay, I know that is a bit of a silly argument, but you get the idea..)


当前回答

我刚刚完成了一个客户端JS-lib (defy .js)的可发布版本,它可以满足您的需求。使用defy .js,您可以使用您熟悉的XPath表达式(没有像JSONPath中那样的新语法表达式)查询JSON结构。

它如何工作的例子(在浏览器这里http://defiantjs.com/defiant.js/demo/sum.avg.htm):看到它

var data = [
       { "x": 2, "y": 0 },
       { "x": 3, "y": 1 },
       { "x": 4, "y": 1 },
       { "x": 2, "y": 1 }
    ],
    res = JSON.search( data, '//*[ y > 0 ]' );

console.log( res.sum('x') );
// 9
console.log( res.avg('x') );
// 3
console.log( res.min('x') );
// 2
console.log( res.max('x') );
// 4

如您所见,defantjs使用搜索函数扩展了全局对象JSON,返回的数组使用聚合函数交付。defantjs包含一些其他功能,但这些超出了本主题的范围。 无论如何,您都可以使用客户端XPath评估器测试库。我认为不熟悉XPath的人会发现这个求值器很有用。 http://defiantjs.com/#xpath_evaluator

更多关于defy .js的信息 http://defiantjs.com/ https://github.com/hbi99/defiant.js

我希望它对你有用…… 问候

其他回答

你可以使用linq.js。

这允许从对象的数据集中使用聚合和选择,就像其他结构数据一样。

var data = [{x: 2, y: 0}, {x: 3 y: 1}, {x: 4, y: 1}); // sum (x) where y > 0 -> console.log (Enumerable.From(数据)其中(" $。y > 0").Sum("$.x")); // list (x) where y > 0 -> [3,4] console.log (Enumerable.From(数据)其中(" $。y > 0").Select("$.x").ToArray()); < script src = " https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js " > < /脚本>

我赞同只使用自己的javascript,但对于更复杂的东西,您可以查看dojo数据。还没有使用过,但看起来它大致提供了您正在寻找的那种查询接口。

如果你使用python, MongoDB有迷你开源版本, MontyDB https://github.com/davidlatwe/montydb 它在github上有500多颗星,并且得到了JetBrains的支持。

from montydb.utils import MontyList
response = [
    {'namespace': 'dash_mantine_components',
     'props': {'checked': True,
               'id': {'index': 0, 'type': 'checkbox'},
               'label': 'My first to do'},
     'type': 'Checkbox'},
    {'namespace': 'dash_mantine_components',
     'props': {'checked': True,
               'id': {'index': 1, 'type': 'checkbox'},
               'label': 'My Another to do'},
     'type': 'Input'}, 
    {'namespace': 'dash_mantine_components',
     'props': {'checked': False,
               'id': {'index': 2, 'type': 'checkbox'},
               'label': 'My next level to do'},
     'type': 'Div'}, 
]

cli = MontyList(response)
cli.find({'props.checked': True},{'type':1})

输出:

MontyList([{'type': 'Checkbox'}, {'type': 'Input'}])

与其他jsonquery选项相比,我更喜欢这个库,因为这个库提供了与MongoDB相同的感觉。

如果你使用的是。net,那么Json。NET支持JSON之上的LINQ查询。这篇文章有一些例子。它支持过滤、映射、分组等。

查看https://github.com/niclasko/Cypher.js(注:我是作者)

它是Cypher图形数据库查询语言和图形数据库的零依赖Javascript实现。它运行在浏览器(测试与Firefox, Chrome, IE)。

与问题相关。它可以用来查询JSON端点:

load json from "http://url/endpoint" as l return l limit 10

下面是一个查询复杂JSON文档并对其进行分析的示例:

js JSON查询示例