Skip to content

Query JSON with JMESPath#

JMESPath เป็นภาษา query สำหรับ JSON ที่คุณสามารถใช้เพื่อดึงและแปลงองค์ประกอบจากเอกสาร JSON สำหรับรายละเอียดทั้งหมดเกี่ยวกับวิธีใช้ JMESPath โปรดดู เอกสาร JMESPath

The jmespath() method#

n8n มีเมธอดที่กำหนดเองคือ jmespath() ใช้เมธอดนี้เพื่อทำการค้นหาบนออบเจกต์ JSON โดยใช้ภาษา query ของ JMESPath

синтаксис พื้นฐานคือ:

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

เพื่อช่วยให้เข้าใจว่าเมธอดทำอะไร นี่คือ JavaScript ที่ยาวกว่าซึ่งเทียบเท่ากัน:

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

Expressions must be single-line

ตัวอย่างโค้ดที่ยาวกว่านี้ใช้ไม่ได้ใน Expressions เนื่องจากต้องเป็นบรรทัดเดียว

object คือออบเจกต์ JSON เช่น ผลลัพธ์จาก node ก่อนหน้า searchString คือ expression ที่เขียนด้วยภาษา query ของ JMESPath JMESPath Specification มีรายการของ expressions ที่รองรับ ในขณะที่ Tutorial และ Examples ของพวกเขามีตัวอย่างแบบโต้ตอบ

Search parameter order

ตัวอย่างใน JMESPath Specification เป็นไปตามรูปแบบ search(searchString, object) ไลบรารี JMESPath JavaScript ซึ่ง n8n ใช้ รองรับ search(object, searchString) แทน ซึ่งหมายความว่าเมื่อใช้ตัวอย่างจากเอกสาร JMESPath คุณอาจต้องเปลี่ยนลำดับของพารามิเตอร์ฟังก์ชัน search

Common tasks#

ส่วนนี้ให้ตัวอย่างสำหรับการดำเนินการทั่วไปบางอย่าง ตัวอย่างเพิ่มเติมและคำแนะนำโดยละเอียดมีอยู่ใน เอกสารของ JMESPath เอง

เมื่อลองใช้ตัวอย่างเหล่านี้ คุณต้องตั้งค่า Code node Mode เป็น Run Once for Each Item

Apply a JMESPath expression to a collection of elements with projections#

จาก เอกสาร JMESPath projections:

Projections เป็นหนึ่งในฟีเจอร์หลักของ JMESPath ใช้เพื่อใช้ expression กับคอลเลกชันขององค์ประกอบ JMESPath รองรับ projections ห้าประเภท:

  • List Projections
  • Slice Projections
  • Object Projections
  • Flatten Projections
  • Filter Projections

ตัวอย่างต่อไปนี้แสดงการใช้งานพื้นฐานของ list, slice, และ object projections โปรดดู เอกสาร JMESPath projections สำหรับคำอธิบายโดยละเอียดของแต่ละประเภท projection และตัวอย่างเพิ่มเติม

กำหนด JSON นี้จาก webhook node:

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

ดึง list ของชื่อจริงของทุกคน:

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

รับ slice ของชื่อจริง:

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

รับรายการอายุของสุนัขโดยใช้ object projections:

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

Select multiple elements and create a new list or object#

ใช้ Multiselect เพื่อเลือกองค์ประกอบจากออบเจกต์ JSON และรวมเข้าด้วยกันเป็น list หรือ object ใหม่

กำหนด JSON นี้จาก webhook node:

 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 เพื่อรับชื่อจริงและนามสกุล และสร้าง lists ใหม่ที่มีทั้งสองชื่อ:

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

An alternative to arrow functions in expressions#

ตัวอย่างเช่น สร้างข้อมูลอินพุตบางส่วนโดยการคืนค่าโค้ดด้านล่างจาก Code node:

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