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


当前回答

编辑 2022 年 9 月:

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

原:

当然可以,这样怎么样:

JsonPath。 Json查询

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

2015年9月:

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

其他回答

我是一种新的JSON查询语言的开发者,叫做~Q(发音为“unquery”)。它旨在解决其他JSON查询语言的许多缺点,并平衡易用性和表达能力。作为主要开发者,我当然是有偏见的,但你可以自己看看并决定:

https://github.com/xcite-db/Unquery

对于OP的例子,~Q中的查询将是:

{
    "example1:[]" : "$sum(x)?y>0",
    "example2:[]" : ["x?y>0"]
}

我刚刚完成了一个客户端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

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

谷歌有一个项目叫lovefield;刚刚发现了它,它看起来很有趣,尽管它比键入下划线或lodash更复杂。 https://github.com/google/lovefield

Lovefield是一个用纯JavaScript编写的关系查询引擎。它 还提供了在浏览器端持久化数据的帮助。 使用IndexedDB本地存储数据。它提供了类似sql的语法和 跨浏览器工作(目前支持Chrome 37+, Firefox 31+, IE 10+, Safari 5.1+…


这个领域最近出现的另一个有趣的条目叫做jinqJs。 http://www.jinqjs.com/ 简单回顾一下示例,它看起来很有前途,API文档似乎写得很好。


function isChild(row) {
  return (row.Age < 18 ? 'Yes' : 'No');
}

var people = [
  {Name: 'Jane', Age: 20, Location: 'Smithtown'},
  {Name: 'Ken', Age: 57, Location: 'Islip'},
  {Name: 'Tom', Age: 10, Location: 'Islip'}
];

var result = new jinqJs()
  .from(people)
  .orderBy('Age')
  .select([{field: 'Name'}, 
     {field: 'Age', text: 'Your Age'}, 
     {text: 'Is Child', value: isChild}]);

jinqJs is a small, simple, lightweight and extensible javaScript library that has no dependencies. jinqJs provides a simple way to perform SQL like queries on javaScript arrays, collections and web services that return a JSON response. jinqJs is similar to Microsoft's Lambda expression for .Net, and it provides similar capabilities to query collections using a SQL like syntax and predicate functionality. jinqJs’s purpose is to provide a SQL like experience to programmers familiar with LINQ queries.

我使用SQLite: https://sqlite.org/json1.html

这很好,因为你可以使用实际的SQL语言,SQLite非常快。

首先我创建一个临时表:

create temp table data as select value from json_each(readfile('data.json'))

然后使用SQLite JSON函数:

select value->'$.foo' foo, count(value->'$.bar') nbar from data group by foo 

如果你想使用纯javascript试试这个:

Var对象= {result: {data: {point1: "x", value: 2}, foo: {bar: 7}}}, Path = 'result.data.value', getValue = (o, p) => p.split('.')。Reduce ((r, k) => r[k], o); console.log (getValue(对象,路径));