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

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

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


当前回答

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

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

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

其他回答

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

来自Dojo文档:

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

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

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

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

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

js看起来也很酷,这里有一个简单的例子:

var obj = {
        "car": [
            {"id": 10, "color": "silver", "name": "Volvo"},
            {"id": 11, "color": "red",    "name": "Saab"},
            {"id": 12, "color": "red",    "name": "Peugeot"},
            {"id": 13, "color": "yellow", "name": "Porsche"}
        ],
        "bike": [
            {"id": 20, "color": "black", "name": "Cannondale"},
            {"id": 21, "color": "red",   "name": "Shimano"}
        ]
    },
    search = JSON.search(obj, '//car[color="yellow"]/name');

console.log( search );
// ["Porsche"]

var reds = JSON.search(obj, '//*[color="red"]');

for (var i=0; i<reds.length; i++) {
    console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano

最新的XPath规范包括JSON支持:

XPath的主要目的是处理XML树和JSON树的节点。XPath得名于它使用路径符号在XML文档的层次结构中导航。XPath使用紧凑的非XML语法,以方便在uri和XML属性值中使用XPath。XPath 3.1为导航JSON树添加了类似的语法。

XQuery也是如此:

JSON是一种轻量级的数据交换格式,广泛用于在web上交换数据和在数据库中存储数据。许多应用程序将JSON与XML和HTML一起使用。XQuery 3.1扩展了XQuery以支持JSON和XML,向数据模型添加了映射和数组,并使用语言中的新表达式和[XQuery and XPath functions and Operators 3.1]中的新函数来支持它们。

@Naftule -使用" defy .js",可以用XPath表达式查询JSON结构。看看这个计算器,了解它是如何工作的:

http://www.defiantjs.com/#xpath_evaluator

与JSONPath不同,“defy .js”提供了对查询语法的全面支持——对JSON结构上的XPath。

defy .js的源代码可以在这里找到: https://github.com/hbi99/defiant.js