当在复杂的JSON数组和散列中搜索项时,比如:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
是否有某种查询语言,我可以用来在[0]中找到一个项目。id = 3的对象?
当在复杂的JSON数组和散列中搜索项时,比如:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
是否有某种查询语言,我可以用来在[0]中找到一个项目。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 ===“本田”&& .year > 2009}.model json:select()(更多的灵感来自CSS选择器) .automobile .maker:val("Honda") .model JSONPath(更多地受XPath启发) 美元.automobiles [? (@.maker =“本田”)]得
其他回答
我知道的其他选择是
JSONiq specification, which specifies two subtypes of languages: one that hides XML details and provides JS-like syntax, and one that enriches XQuery syntax with JSON constructors and such. Zorba implements JSONiq. Corona, which builds on top of MarkLogic provides a REST interface for storing, managing, and searching XML, JSON, Text and Binary content. MarkLogic 6 and later provide a similar REST interface as Corona out of the box. MarkLogic 8 and later support JSON natively in both their XQuery and Server-side JavaScript environment. You can apply XPath on it.
HTH.
为了增加更多的选择,还有XPath。XPath 3.1处理JSON和XML。在XPath 3.1中,您需要的查询是?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 ===“本田”&& .year > 2009}.model json:select()(更多的灵感来自CSS选择器) .automobile .maker:val("Honda") .model JSONPath(更多地受XPath启发) 美元.automobiles [? (@.maker =“本田”)]得
是否存在某种查询语言…
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正则表达式) 它是图灵完备的吗?(是的)
尝试使用JSPath
JSPath是一种特定于领域的语言(DSL),它使您能够在JSON文档中导航和查找数据。使用JSPath,您可以选择JSON项,以便检索其中包含的数据。
JSON的JSPath就像XML的XPath。
它针对Node.js和现代浏览器进行了大量优化。