Skip to content

使用 JMESPath 查询 JSON

JMESPath是一种 JSON 查询语言,可用于从 JSON 文档中提取和转换元素。有关如何使用 JMESPath 的完整详细信息,请参阅JMESPath 文档

方法​

n8n 提供了一种自定义方法。使用此方法可以使用 JMESPath 查询语言对 JSON 对象执行搜索。

基本语法是:

1
$jmespath(object, searchString)
1
_jmespath(object, searchString)

为了帮助理解该方法的作用,下面是等效的更长的 JavaScript:

1
2
var jmespath = require('jmespath');
jmespath.search(object, searchString);

表达式必须是单行

较长的代码示例在表达式中不起作用,因为它们必须是单行的。

是一个 JSON 对象,例如上一个节点的输出。是一个用 JMESPath 查询语言编写的表达式。JMESPath规范提供了支持的表达式列表,其教程示例则提供了交互式示例。

搜索参数顺序

JMESPath 规范中的示例遵循以下模式。n8n使用的JMESPath JavaScript 库则支持该模式。这意味着,在使用 JMESPath 文档中的示例时,您可能需要更改搜索函数参数的顺序。

常见任务

本节提供一些常见操作的示例。更多示例和详细指南请参阅JMESPath 的文档

尝试这些示例时,您需要将代码节点模式设置为“为每个项目运行一次” 。

将 JMESPath 表达式应用于具有投影的元素集合

来自JMESPath 投影文档

投影是 JMESPath 的关键功能之一。您可以使用它将表达式应用于元素集合。JMESPath 支持五种投影:

  • 列表投影
  • 切片投影
  • 物体投影
  • 展平投影
  • 过滤投影

以下示例展示了列表、切片和对象投影的基本用法。请参阅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
        }
      }
    }
  }
]

检索所有人的名字列表

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"
		]
	}
]
"""

获取名字的一部分

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:
[
	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
*/
 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"
		]
	}
]
"""

使用对象投影获取狗的年龄列表:

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
        }
      }
    }
  }
]

使用多选列表获取名字和姓氏并创建包含这两个名字的新列表:

1
2
{{$jmespath($json.body.people, "[].[first, last]")}}
// Returns [["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};
/* Returns:
[
	{
		"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}
"""
Returns:
[
	{
		"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": ""
    }
  }  
]

您可以进行如下搜索:“查找名称为联想的商品并告诉我其类别 ID”。

1
{{ $jmespath($("Code").all(), "[?json.name=='Lenovo'].json.category_id") }}