在复杂的JSON数组和哈希中搜索项目时,例如:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
我是否可以使用某种查询语言来查找项in [0].objects where id = 3
?
答案 0 :(得分:115)
答案 1 :(得分:20)
我认为JSONQuery是JSONPath的超集,因而是replaces it in dojo。然后还有RQL。
来自Dojo文档:
JSONQuery是JSONPath的扩展版本,具有其他功能 为了安全性,易用性和全面的数据查询 工具包括过滤,递归搜索,排序,映射,范围 选择,以及带有通配符字符串比较的灵活表达式 和各种运营商。
JSONselect对此问题有另一种观点(类似CSS选择器,而不是XPath)并且有一个JavaScript implementation。
答案 2 :(得分:17)
我所知道的其他替代方案是
答案 3 :(得分:16)
总结一些用于遍历/过滤JSON数据的当前选项,并提供一些语法示例......
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json:select()(受CSS选择者启发更多)
.automobiles .maker:val("Honda") .model
JSONPath(受XPath启发更多)
$.automobiles[?(@.maker='Honda')].model
我认为JSPath看起来最好,所以我将尝试将它与我的AngularJS + CakePHP应用程序集成。
(我最初在another thread发布了这个答案,但认为这也很有用。)
答案 4 :(得分:13)
尝试使用JSPath
JSPath是一种特定于域的语言(DSL),使您可以在JSON文档中导航和查找数据。使用JSPath,您可以选择JSON项以检索它们包含的数据。
用于JSON的JSPath,如用于XML的XPath。
它对Node.js和现代浏览器都进行了大量优化。
答案 5 :(得分:9)
只要处理器提供JSON支持,XQuery就可用于查询JSON。这是一个简单的示例,如何使用BaseX查找“id”= 1的对象:
json:parse('[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]')//value[.//id = 1]
答案 6 :(得分:7)
Json Pointer似乎也得到越来越多的支持。
答案 7 :(得分:7)
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
答案 8 :(得分:6)
ObjectPath是一种类似于XPath或JSONPath的查询语言,但由于嵌入式算术计算,比较机制和内置函数,功能更强大。 请参阅语法:
在店内找到所有红色鞋子,价格低于50的鞋子
$ ..鞋子。* [颜色为“红色”,价格&lt; 50]
答案 9 :(得分:6)
Jsel非常棒,基于真正的XPath引擎。它允许您创建XPath表达式以查找任何类型的JavaScript数据,而不仅仅是对象(字符串)。
您可以创建自定义架构和映射,以便完全控制XPath引擎可以如何遍历数据。模式是一种定义数据中元素,子元素,属性和节点值的定义方式。然后你可以创建自己的表达式以适应。
鉴于您有一个名为data
的变量,其中包含问题中的JSON,您可以使用jsel来编写:
jsel(data).select("//*[@id=3]")
这将返回id
属性为3的任何节点。属性是对象中的任何原语(字符串,数字,日期,正则表达式)。
答案 10 :(得分:5)
是否有某种查询语言......
jq定义了与JSONPath非常相似的 J SON q uery语言 - 请参阅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有指向教程等的指针。
jq也像SQL一样,它支持CRUD操作,尽管jq处理器永远不会覆盖它的输入。 jq还可以处理JSON实体流。
在评估面向JSON的查询语言时,您可能希望考虑的另外两个标准是:
答案 11 :(得分:4)
@Naftule - 使用“defiant.js”,可以使用XPath表达式查询JSON结构。查看此评估者,了解其工作原理:
http://www.defiantjs.com/#xpath_evaluator
与JSONPath不同,“defiant.js”提供了对JSON结构上的XPath查询语法的全面支持。
defiant.js的源代码可以在这里找到:
https://github.com/hbi99/defiant.js
答案 12 :(得分:3)
JMESPath在当今(截至2020年)似乎非常流行,并且解决了JSONPath的许多问题。它适用于多种语言。
答案 13 :(得分:1)
如果你像我一样,你只想做基于路径的查找,但不关心真正的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'
答案 14 :(得分:1)
只需添加选择,这里还有XPath。 XPath 3.1处理JSON和XML。在XPath 3.1中,您需要的查询是ClassSymbol
答案 15 :(得分:0)
试试这个 - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
对于xml,它在类似的xpath行上是一个非常简单的实现。它的名字是jpath。
答案 16 :(得分:0)
我知道OP用javascript
标记了问题,但就我而言,我只是从Java后端(使用Camel)寻找完全相同的东西。
有趣的是,如果您使用的是Camel之类的集成框架,那么jsonPath
也受Camel 2.13以后的特定Camel Component支持。
上面的骆驼文档中的示例:
from("queue:books.new")
.choice()
.when().jsonpath("$.store.book[?(@.price < 10)]")
.to("jms:queue:book.cheap")
.when().jsonpath("$.store.book[?(@.price < 30)]")
.to("jms:queue:book.average")
.otherwise()
.to("jms:queue:book.expensive")
使用起来非常简单
答案 17 :(得分:0)
latest XPath spec 包括 JSON 支持:
<块引用>XPath 的主要目的是寻址 XML 树和 JSON 树的节点。 XPath 因其使用路径表示法在 XML 文档的层次结构中导航而得名。 XPath 使用紧凑的非 XML 语法来促进在 URI 和 XML 属性值中使用 XPath。 XPath 3.1 添加了类似的语法来导航 JSON 树。
XQuery 也是如此:
<块引用>JSON 是一种轻量级数据交换格式,广泛用于在网络上交换数据和将数据存储在数据库中。许多应用程序将 JSON 与 XML 和 HTML 一起使用。 XQuery 3.1 扩展了 XQuery 以支持 JSON 和 XML,向数据模型添加映射和数组,并通过语言中的新表达式和 [XQuery 和 XPath 函数和运算符 3.1] 中的新函数支持它们。