是否有(大致)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),但似乎还没有出现标准用法或一组库.虽然每个功能都可以自行实现,但如果有人已经做好了,我不想重新发明轮子.
有什么建议?
编辑:这可能确实是一个坏主意,或者JSON可能过于通用我正在思考的格式..想要查询语言而不是直接根据需要直接执行求和/等功能的原因是我希望构建查询动态地基于用户输入.有点像"我们不需要SQL,我们只能编写我们需要的功能"的论点.最终要么失控,要么在你进一步推动时最终编写自己的SQL版本.(好吧,我知道这是一个有点愚蠢的论点,但你明白了......)
当然,怎么样:
JAQL
JsonPath.
Json查询
它们似乎都在进行中,但在某种程度上起作用.它们在概念上也类似于XPath和XQuery; 即使XML和JSON具有不同的概念模型(层次结构与对象/结构).
编辑 2015年9月:实际上现在有JSON指针标准允许非常简单有效地遍历JSON内容.它不仅是正式指定的,而且还受到许多JSON库的支持.因此,我将其称为实际真正有用的标准,尽管由于其表达能力有限,它可能会或可能不会被视为查询语言本身.
我推荐我正在研究的项目叫做jLinq.我正在寻找反馈,所以我有兴趣听听你的想法.
如果让你编写类似于LINQ中的查询...
var results = jLinq.from(records.users) //you can join records .join(records.locations, "location", "locationId", "id") //write queries on the data .startsWith("firstname", "j") .or("k") //automatically remembers field and command names //even query joined items .equals("location.state", "TX") //and even do custom selections .select(function(rec) { return { fullname : rec.firstname + " " + rec.lastname, city : rec.location.city, ageInTenYears : (rec.age + 10) }; });
它也是完全可扩展的!
文档仍在进行中,但您仍可以在线试用.
更新:XQuery 3.1可以查询XML或JSON - 或两者一起查询.和XPath的3.1也可以.
名单正在增长:
JSONiq(基于XQuery)
UNQL(像SQL)
JaQL(功能)
JsonPath(类XPath)
Json Query(类似于XPath)
GraphQL(基于模板,键入)
jmespath的工作非常简单,很好,http: //jmespath.org/ 亚马逊在AWS命令行界面中使用它,所以它必须非常稳定.
内置array.filter()
方法使大多数这些所谓的javascript查询库过时
您可以在代理中放置尽可能多的条件:简单比较,startsWith等.我没有测试过,但您也可以嵌套过滤器来查询内部集合.
ObjectPath是复杂或未知结构的JSON文件简单ligthweigth查询语言.它与XPath或JSONPath类似,但由于嵌入式算术计算,比较机制和内置函数,功能更强大.
Python版本已经成熟并用于生产.JS仍处于测试阶段.
可能在不久的将来,我们将提供一个完整的Javascript版本.我们还希望进一步开发它,以便它可以作为Mongo查询的简单替代方案.
jq是一种J SON q uery语言,主要用于命令行,但绑定到各种编程语言(Java,node.js,php,...),甚至可以通过jq-web在浏览器中使用.
以下是基于原始问题的一些插图,以此JSON为例:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X)WHERE Y> 0(等于7)
map(select(.y > 0)) | add
列表(X)Y> 0(等于[3,4])
map(.y > 0)
如果您使用的是.NET,则Json.NET支持JSON顶部的LINQ查询.这篇文章有一些例子.它支持过滤,映射,分组等.
另一种看待这种情况的方法是使用mongoDB您可以将您的JSON存储在mongo中,然后通过mongodb查询语法进行查询.