当在复杂的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的对象?
当前回答
尝试使用JSPath
JSPath是一种特定于领域的语言(DSL),它使您能够在JSON文档中导航和查找数据。使用JSPath,您可以选择JSON项,以便检索其中包含的数据。
JSON的JSPath就像XML的XPath。
它针对Node.js和现代浏览器进行了大量优化。
其他回答
Jsel很棒,它基于真正的XPath引擎。它允许您创建XPath表达式来查找任何类型的JavaScript数据,而不仅仅是对象(字符串)。
您可以创建自定义模式和映射,从而完全控制XPath引擎如何处理数据。模式是一种定义如何在数据中定义元素、子元素、属性和节点值的方法。然后你可以创建自己的表达式来适应。
假设你有一个名为data的变量,其中包含来自问题的JSON,你可以使用jsel写:
jsel(data).select("//*[@id=3]")
这将返回id属性为3的任何节点。属性是对象内的任何基本元素(字符串、数字、日期、正则表达式)值。
ObjectPath是一种类似于XPath或JSONPath的查询语言,但由于嵌入了算术计算、比较机制和内置函数,它的功能要强大得多。 请看语法:
商店里所有的鞋子都是红色的,价格在50美元以下
美元. .鞋子。*[颜色为“红色”,价格< 50]
为了增加更多的选择,还有XPath。XPath 3.1处理JSON和XML。在XPath 3.1中,您需要的查询是?0?Objects?*[?id = 3)
我知道OP用javascript标记了这个问题,但在我的情况下,我看起来完全一样,但从Java后端(与Camel)。
有趣的是,如果您使用的是像Camel这样的集成框架,jsonPath也由特定的Camel组件支持,从Camel 2.13开始。
例子来自上面的Camel文档:
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")
使用起来很简单。
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