使用 JMESPath 查询 JSON#
JMESPath 是一种用于 JSON 的查询语言,可用于从 JSON 文档中提取和转换元素。有关如何使用 JMESPath 的完整细节,请参考 JMESPath 官方文档。
jmespath() 方法#
n8n 提供了一个自定义方法 jmespath()。你可以使用该方法结合 JMESPath 查询语言对 JSON 对象执行搜索。
基本语法如下:
1| ``` $jmespath(object, searchString)
---|---1
| ```
_jmespath(object, searchString)---|---
为了帮助理解该方法的作用,以下是等效的 JavaScript 长格式代码:
1
2| ``` 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 官方文档。 尝试这些示例时,你需要将代码节点(Code node)的 模式(Mode) 设置为 对每个项目运行一次(Run Once for Each Item)。
使用投影将 JMESPath 表达式应用于元素集合#
根据 JMESPath 投影文档:
投影是 JMESPath 的关键特性之一。它用于将表达式应用于一组元素。JMESPath 支持五种类型的投影:
- 列表投影(List Projections)
- 切片投影(Slice Projections)
- 对象投影(Object Projections)
- 展平投影(Flatten Projections)
- 过滤投影(Filter Projections)
以下示例展示了列表、切片和对象投影的基本用法。有关每种投影类型的详细说明和其他示例,请参考 JMESPath 投影文档。 给定来自 Webhook 节点的如下 JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36| ``` [ { "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 } } } } ]
---|--- 检索所有人(people)的名字列表: Expressions (JavaScript)Code node (JavaScript)Code node (Python)
1
2| ``` {{$jmespath($json.body.people,"[*].first")}} // Returns ["James", "Jacob", "Jayden"]
---|---1 2 3 4 5 6 7 8 9 10 11 12 13
| ```
let firstNames = $jmespath($json.body.people,"[*].first")
return {firstNames};
/* Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
*/---|---
1
2
3
4
5
6
7
8
9
10
11
12
13
14| ``` firstNames = _jmespath(_json.body.people, "[*].first" ) return {"firstNames": firstNames} """ Returns: [ { "firstNames": [ "James", "Jacob", "Jayden" ] } ] """
---|---
获取名字的[切片](https://jmespath.org/tutorial.html#list-and-slice-projections)(前两个):
[Expressions (JavaScript)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_3_1)[Code node (JavaScript)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_3_2)[Code node (Python)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_3_3)1 2
| ```
{{$jmespath($json.body.people,"[:2].first")}}
// Returns ["James", "Jacob"]---|---
1
2
3
4
5
6
7
8
9
10
11
12
13| ``` let firstTwoNames = $jmespath($json.body.people,"[:2].first"); return {firstTwoNames}; /_ Returns: [ { "firstTwoNames": [ "James", "Jacob" ] } ] _/
---|---1 2 3 4 5 6 7 8 9 10 11 12 13
| ```
firstTwoNames = _jmespath(_json.body.people, "[:2].first" )
return {"firstTwoNames": firstTwoNames}
"""
Returns:
[
{
"firstTwoNames": [
"James",
"Jacob"
]
}
]
"""---|--- 使用对象投影获取狗(dogs)年龄的列表: Expressions (JavaScript)Code node (JavaScript)Code node (Python)
1
2| ``` {{$jmespath($json.body.dogs,"*.age")}} // Returns [7,5]
---|---1 2 3 4 5 6 7 8 9 10 11 12
| ```
let dogsAges = $jmespath($json.body.dogs,"*.age");
return {dogsAges};
/* Returns:
[
{
"dogsAges": [
7,
5
]
}
]
*/---|---
1
2
3
4
5
6
7
8
9
10
11
12
13| ``` dogsAges = _jmespath(_json.body.dogs, "*.age") return {"dogsAges": dogsAges} """ Returns: [ { "dogsAges": [ 7, 5 ] } ] """
---|---
选择多个元素并创建新列表或对象#
使用 Multiselect(多选) 从 JSON 对象中选择元素,并将它们组合成一个新的列表或对象。 以下是一个来自 webhook 节点的 JSON 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36| ``` [ { "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 } } } } ]
---|---
使用多选列表(multiselect list)获取 first 和 last 名字,并创建包含这两个名字的新列表:
[表达式 (JavaScript)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_5_1)[代码节点 (JavaScript)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_5_2)[代码节点 (Python)](https://docs.n8n.io/code/cookbook/jmespath/#__tabbed_5_3)1 2
| ```
{{$jmespath($json.body.people,"[].[first, last]")}}
// 返回 [["James","Green"],["Jacob","Jones"],["Jayden","Smith"]]---|---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22| ``` let newList = $jmespath($json.body.people, "[].[first, last]"); return { newList }; /_ 返回: [ { "newList": [ [ "James", "Green" ], [ "Jacob", "Jones" ], [ "Jayden", "Smith" ] ] } ] _/
---|---1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ```
newList = _jmespath(_json.body.people, "[].[first, last]")
return {"newList": newList}
"""
返回:
[
{
"newList": [
[
"James",
"Green"
],
[
"Jacob",
"Jones"
],
[
"Jayden",
"Smith"
]
]
}
]
"""---|---
表达式中箭头函数的替代方案#
例如,通过在代码节点中返回以下代码来生成一些输入数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28| ``` 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 的项,并返回其 category ID”的查询:1
| ```
{{$jmespath($("Code").all(), "[?json.name=='Lenovo'].json.category_id")}}
---|---