使用 JMESPath 查询 JSON
JMESPath 是一种 JSON 查询语言,可用于从 JSON 文档中提取和转换元素。完整用法请参阅 JMESPath 文档。
jmespath() 方法
n8n 提供了自定义方法 jmespath()。你可以使用此方法,以 JMESPath 查询语言搜索 JSON 对象。
基本语法如下:
$jmespath(object, searchString)
仅支持 JavaScript
Python Code 节点不提供 $jmespath()。要在 Python 中获得相同结果,请使用标准 Python 写法。下方每个示例都提供了 Python 版本。
为了帮助你理解此方法的作用,下面给出了等效但更长的 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 官方文档。
尝试这些示例时,需要将 Code 节点的 **Mode(模式)**设置为 Run Once for Each Item(为每个数据项运行一次)。
通过投影将 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)
{{$jmespath($json.body.people, "[*].first" )}}
// Returns ["James", "Jacob", "Jayden"]
Code 节点(JavaScript)
let firstNames = $jmespath($json.body.people, "[*].first" )
return {firstNames};
/* Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
*/
Code 节点(Python )
people = _item["json"]["body"]["people"]
first_names = [person["first"] for person in people]
return {"firstNames": first_names}
"""
Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
"""
获取名字列表的一个切片:
表达式(JavaScript)
{{$jmespath($json.body.people, "[:2].first")}}
// Returns ["James", "Jacob"]
Code 节点(JavaScript)
let firstTwoNames = $jmespath($json.body.people, "[:2].first");
return {firstTwoNames};
/* Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
*/
Code 节点(Python)
people = _item["json"]["body"]["people"]
first_two_names = [person["first"] for person in people[:2]]
return {"firstTwoNames": first_two_names}
"""
Returns:
[
{
"firstTwoNames": [
"James",
"Jacob"
]
}
]
"""
使用对象投影获取所有狗的年龄列表:
表达式(JavaScript)
{{$jmespath($json.body.dogs, "*.age")}}
// Returns [7,5]
Code 节点(JavaScript)
let dogsAges = $jmespath($json.body.dogs, "*.age");
return {dogsAges};
/* Returns:
[
{
"dogsAges": [
7,
5
]
}
]
*/
Code 节点(Python)
dogs = _item["json"]["body"]["dogs"]
dogs_ages = [dog["age"] for dog in dogs.values()]
return {"dogsAges": dogs_ages}
"""
Returns:
[
{
"dogsAges": [
7,
5
]
}
]
"""