在搜索复杂的JSON数组和哈希表中的项目时,例如:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
有没有一种查询语言可以用来在[0].objects
中查找id等于3的项?
在搜索复杂的JSON数组和哈希表中的项目时,例如:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
有没有一种查询语言可以用来在[0].objects
中查找id等于3的项?
JMESPath是一款非常成熟的库,具有详细的规范和支持多种语言的功能。
// Select a single item
people[1].firstName
// Select a slice of an array
people[0:5]
// Select all the first names
people[*].firstName
// Select all first names based on search term
people[?state=='VA'].firstName
// Count how many people are over 35
length(people[?age>`35`])
// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}
// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)
在文档中,您可以尝试更多实时示例。
这个JS库被压缩后有19kb,可能比一些库要大,但考虑到其广泛的功能,您可能会觉得它值得。
还有一些其他选项可用于遍历/过滤JSON数据,以及一些语法示例可帮助您进行比较...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json:select()(更像CSS选择器)
.automobiles .maker:val("Honda") .model
JSONPath(更像XPath)
$.automobiles[?(@.maker='Honda')].model
我认为JSONQuery是JSONPath的超集,因此在dojo中取代了它。此外还有RQL。
来自Dojo文档:
JSONQuery是JSONPath的扩展版本,具有额外的功能,包括安全性、易用性和全面的数据查询工具,包括过滤、递归搜索、排序、映射、范围选择和灵活的表达式,具有通配符字符串比较和各种运算符。
JSONselect在这个问题上有另一种观点(类似于CSS选择器而不是XPath),并且有一个JavaScript实现。
是否有某种查询语言...
jq 定义了一种与 JSONPath 非常相似的JSON query 语言,详情请参见 https://github.com/stedolan/jq/wiki/For-JSONPath-users
...我可以用它来查找[0].objects中 id = 3 的项目吗?
我会假设这意味着:在指定的键下查找所有 id == 3 的 JSON 对象,无论对象在哪里。 相应的jq查询如下:
.[0].objects | .. | objects | select(.id==3)
其中“|”是管道运算符(如命令行shell中的管道),而段落“.. | objects”对应于“无论对象在哪里”。
jq的基础知识通常很明显、直观或至少相当简单,如果您对命令行shell管道有所了解,那么大多数其他内容都很容易掌握。 jq FAQ 提供了指向教程等的指针。
与SQL类似,jq也支持CRUD操作,但jq处理器永远不会覆盖其输入。jq还可以处理JSON实体流。
在评估面向JSON的查询语言时,您可能希望考虑另外两个标准:
XQuery可以用于查询JSON,前提是处理器提供了JSON支持。这是一个很简单的例子,演示了如何使用BaseX查找具有“id” = 1的对象:
json:parse('[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]')//value[.//id = 1]
Defiant.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
Jsel非常棒,它基于真正的XPath引擎。它允许您创建XPath表达式来查找任何类型的JavaScript数据,而不仅仅是对象(也包括字符串)。
您可以创建自定义模式和映射,完全控制XPath引擎如何遍历您的数据。模式是定义元素、子元素、属性和节点值在您的数据中如何定义的一种方式。然后,您可以创建自己的表达式来适应。
假设您有一个名为data
的变量,其中包含问题中的JSON,您可以使用jsel编写:
jsel(data).select("//*[@id=3]")
这将返回任何具有 id
属性为3的节点。属性是对象中的任何原始(字符串、数字、日期、正则表达式)值。
in(...).where(...).select(...)
):http://hugoware.net/Projects/jLinq。 - pimvdbdata
,你可以编写:jsel(data).select("//*[@id=3]")
,它将返回包含id键为3的对象。 - Ali