是否有(大致)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..)


当前回答

好吧,这篇文章有点老了,但是……如果你想用原生JSON(或JS对象)对JS对象进行类似sql的查询,请查看https://github.com/deitch/searchjs

它既是一种完全用JSON编写的jsql语言,也是一种参考实现。你可以说,“我想在数组中找到所有对象,其name==="John" && age===25 as:

{name:"John",age:25,_join:"AND"}

参考实现searchjs可以在浏览器中工作,也可以作为节点npm包工作

npm install searchjs

它还可以做复杂连接和否定(NOT)之类的事情。它本身就忽略了大小写。

它还没有做求和或计数,但在外面做这些可能更容易。

其他回答

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

更新:XQuery 3.1可以查询XML或JSON—或者同时查询两者。XPath 3.1也可以。

这个名单还在增加:

JSONiq(基于XQuery) UNQL(类似SQL) JaQL(功能) JsonPath(于xpath) Json查询(类似于xpath) GraphQL(基于模板,类型化)

编辑 2022 年 9 月:

JMESPath似乎是使用最广泛、增长最快、评价最好的替代方案。它有很多功能,包括“where”风格的过滤器。

原:

当然可以,这样怎么样:

JsonPath。 Json查询

它们似乎都在进行中,但在某种程度上是有效的。它们在概念上也类似于XPath和XQuery;尽管XML和JSON有不同的概念模型(层次结构vs对象/结构)。

2015年9月:

实际上,现在有一个JSON指针标准,可以非常简单有效地遍历JSON内容。它不仅是正式指定的,而且许多JSON库也支持它。所以我将它称为真正有用的标准,尽管由于其表达能力有限,它本身可能被认为是查询语言,也可能不被认为是查询语言。

当前的Jaql实现目标是使用Hadoop集群进行大型数据处理,因此可能超出了您的需求。然而,它可以在没有Hadoop集群的情况下轻松运行(但仍然需要编译Hadoop代码及其依赖项,其中大部分都包括在内)。Jaql的一个小实现可以嵌入到Javascript和浏览器中,这将是对项目的一个很好的补充。

上面的例子很容易用jaql编写:

$data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];

$data -> filter $.y > 0 -> transform $.x -> sum(); // 7

$data -> filter $.y > 0 -> transform $.x; // [3,4]

当然,还有更多。例如:

// Compute multiple aggregates and change nesting structure:
$data -> group by $y = $.y into { $y, s:sum($[*].x), n:count($), xs:$[*].x}; 
    // [{ "y": 0, "s": 2, "n": 1, "xs": [2]   },
    //  { "y": 1, "s": 7, "n": 2, "xs": [3,4] }]

// Join multiple data sets:
$more = [{ "y": 0, "z": 5 }, { "y": 1, "z": 6 }];
join $data, $more where $data.y == $more.y into {$data, $more};
    // [{ "data": { "x": 2, "y": 0 }, "more": { "y": 0, "z": 5 }},
    //  { "data": { "x": 3, "y": 1 }, "more": { "y": 1, "z": 6 }},
    //  { "data": { "x": 4, "y": 1 }, "more": { "y": 1, "z": 6 }}]

Jaql可以在http://code.google.com/p/jaql/上下载和讨论

查看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查询示例