跳到主要内容

使用JMESPath查询JSON#

JMESPath 是一种用于JSON的查询语言,您可以通过它从JSON文档中提取和转换元素。有关如何使用JMESPath的完整说明,请参阅JMESPath官方文档

jmespath()方法#

n8n提供了一个自定义方法jmespath()。该方法支持使用JMESPath查询语言对JSON对象执行搜索操作。

基础语法如下:

JavaScriptPython
$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") }} 
```_