跳至内容

使用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官方文档

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

对元素集合应用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": ""
    }
  }  
]

你可以进行类似“查找名称为Lenovo的商品并告诉我它们的类别ID”这样的搜索。

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