使用JMESPath查询JSON#
JMESPath 是一种用于JSON的查询语言,您可以通过它从JSON文档中提取和转换元素。有关如何使用JMESPath的完整说明,请参阅JMESPath官方文档。
jmespath()方法#
n8n提供了一个自定义方法jmespath()。该方法支持使用JMESPath查询语言对JSON对象执行搜索操作。
基础语法如下:
| JavaScript | Python |
|---|---|
$jmespath(object, searchString) | _jmespath(object, searchString) |
为帮助理解该方法的功 能,以下是等效的较长JavaScript代码:
var jmespath = require('jmespath');
jmespath.search(object, searchString);
表达式必须为单行
较长的代码示例在表达式中无法使用,因为表达式必须为单行。
object 是 JSON 对象,例如先前节点的输出。searchString 是使用 JMESPath 查询语言编写的表达式。JMESPath 规范提供了支持的表达式列表,而教程和示例则提供了交互式示例。
搜索参数顺序
JMESPath 规范中的示例遵循 search(searchString, object) 模式。而 n8n 使用的 JMESPath JavaScript 库支持 search(object, searchString)。这意味着使用 JMESPath 文档中的示例时,可能需要调整搜索函数参数的顺序。
常见任务#
本节提供了一些常见操作的示例。更多示例和详细指南可在 JMESPath 官方文档中查看。
尝试这些示例时,需将代码节点的模式设置为对每项数据执行一次。
通过投影对元素集合应用 JMESPath 表达式#
引自 JMESPath 投影文档:
投影是 JMESPath 的核心特性之一,用于对元素集合应用表达式。JMESPath 支持五种投影类型:
- 列表投影
- 切片投影
- 对象投影
- 扁平化投影
- 过滤投影
以下示例展示了列表、切片和对象投影的基础用法。关于各投影类型的详细说明及更多示例,请参阅 JMESPath 投影文档。
假设来自 Webhook 节点的 JSON 数据如下:
[
{
"headers": {
"host": "n8n.instance.address",
...
},
"params": {},
"query": {},
"body": {
"people": [
{
"first": "James",
"last": "Green"
},
{
"first": "Jacob",
"last": "Jones"
},
{
"first": "Jayden",
"last": "Smith"
}
],
"dogs": {
"Fido": {
"color": "brown",
"age": 7
},
"Spot": {
"color": "black and white",
"age": 5
}
}
}
}
]
获取所有人员名字的列表:
| 表达式(JavaScript) | 代码节点(JavaScript) | 代码节点(Python) |
|---|---|---|
{{$jmespath($json.body.people, "[*].first" )}} // Returns ["James", "Jacob", "Jayden"] | let firstNames = $jmespath($json.body.people, "[*].first" ) return {firstNames}; /* Returns: [ { "firstNames": [ "James", "Jacob", "Jayden" ] } ] */ | firstNames = _jmespath(_json.body.people, "[*].first" ) return {"firstNames":firstNames} """ Returns: [ { "firstNames": [ "James", "Jacob", "Jayden" ] } ] """ |
获取名字的切片:
| 表达式(JavaScript) | 代码节点(JavaScript) | 代码节点(Python) |
|---|---|---|
{{$jmespath($json.body.people, "[:2].first")}} // Returns ["James", "Jacob"] | let firstTwoNames = $jmespath($json.body.people, "[:2].first"); return {firstTwoNames}; /* Returns: [ { "firstNames": [ "James", "Jacob", "Jayden" ] } ] */ | firstTwoNames = _jmespath(_json.body.people, "[:2].first" ) return {"firstTwoNames":firstTwoNames} """ Returns: [ { "firstTwoNames": [ "James", "Jacob" ] } ] """ |
使用对象投影获取犬只年龄列表:
| 表达式 (JavaScript) | 代码节点 (JavaScript) | 代码节点 (Python) |
|---|---|---|
{{$jmespath($json.body.dogs, "*.age")}} // Returns [7,5] | let dogsAges = $jmespath($json.body.dogs, "*.age"); return {dogsAges}; /* Returns: [ { "dogsAges": [ 7, 5 ] } ] */ | dogsAges = _jmespath(_json.body.dogs, "*.age") return {"dogsAges": dogsAges} """ Returns: [ { "dogsAges": [ 7, 5 ] } ] """ |
选择多个元素并创建新列表或对象#
使用多选功能可从JSON对象中选择元素,并将其组合成新的列表或对象。
以下示例基于来自Webhook节点的JSON数据:
[
{
"headers": {
"host": "n8n.instance.address",
...
},
"params": {},
"query": {},
"body": {
"people": [
{
"first": "James",
"last": "Green"
},
{
"first": "Jacob",
"last": "Jones"
},
{
"first": "Jayden",
"last": "Smith"
}
],
"dogs": {
"Fido": {
"color": "brown",
"age": 7
},
"Spot": {
"color": "black and white",
"age": 5
}
}
}
}
]
使用多选列表获取名字和姓氏,并创建包含这两个名称的新列表:
| 表达式(JavaScript) | 代码节点(JavaScript) | 代码节点(Python) |
|---|---|---|
{{$jmespath($json.body.people, "[].[first, last]")}} // Returns [["James","Green"],["Jacob","Jones"],["Jayden","Smith"]] | let newList = $jmespath($json.body.people, "[].[first, last]"); return {newList}; /* Returns: [ { "newList": [ [ "James", "Green" ], [ "Jacob", "Jones" ], [ "Jayden", "Smith" ] ] } ] */ | newList = _jmespath(_json.body.people, "[].[first, last]") return {"newList":newList} """ Returns: [ { "newList": [ [ "James", "Green" ], [ "Jacob", "Jones" ], [ "Jayden", "Smith" ] ] } ] """ |
_### 表达式中的箭头函数替代方案#
例如,通过从代码节点返回以下代码来生成输入数据:
return[
{
"json": {
"num_categories": "0",
"num_products": "45",
"category_id": 5529735,
"parent_id": 1407340,
"pos_enabled": 1,
"pos_favorite": 0,
"name": "HP",
"description": "",
"image": ""
}
},
{
"json": {
"num_categories": "0",
"num_products": "86",
"category_id": 5529740,
"parent_id": 1407340,
"pos_enabled": 1,
"pos_favorite": 0,
"name": "Lenovo",
"description": "",
"image": ""
}
}
]
您可以执行类似“查找名称为 Lenovo 的项目并告诉我其类别 ID”的搜索。
{{ $jmespath($("Code").all(), "[?json.name=='Lenovo'].json.category_id") }}
```_