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

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

是否有某种查询语言,我可以用来在[0]中找到一个项目。id = 3的对象?


当前回答

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

其他回答

我认为JSONQuery是JSONPath的超集,因此在dojo中取代了JSONPath。还有RQL。

来自Dojo文档:

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

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

是的,它叫做JSONPath:

它还集成到DOJO中。

是否存在某种查询语言…

jq定义了一种与JSONPath非常相似的JSON查询语言——请参阅https://github.com/stedolan/jq/wiki/For-JSONPath-users

... 我可以用它在[0]中找到一个项目。id = 3的对象?

我假设这意味着:找到id == 3指定键下的所有JSON对象,无论对象可能在哪里。对应的jq查询是:

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

其中“|”是管道操作符(如在命令shell管道中),而段“..| objects”对应于“无论对象可能在哪里”。

jq的基本原理在很大程度上是显而易见或直观的,或者至少相当简单,如果您熟悉命令-shell管道,那么其余的大部分内容都很容易掌握。jq常见问题解答中有指向教程之类内容的指针。

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

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

它是否支持正则表达式?(jq 1.5全面支持PCRE正则表达式) 它是图灵完备的吗?(是的)

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

您可以创建自定义模式和映射,从而完全控制XPath引擎如何处理数据。模式是一种定义如何在数据中定义元素、子元素、属性和节点值的方法。然后你可以创建自己的表达式来适应。

假设你有一个名为data的变量,其中包含来自问题的JSON,你可以使用jsel写:

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

这将返回id属性为3的任何节点。属性是对象内的任何基本元素(字符串、数字、日期、正则表达式)值。

ObjectPath是一种类似于XPath或JSONPath的查询语言,但由于嵌入了算术计算、比较机制和内置函数,它的功能要强大得多。 请看语法:

商店里所有的鞋子都是红色的,价格在50美元以下

美元. .鞋子。*[颜色为“红色”,价格< 50]