پرش به محتویات

پرس و جوی JSON با JMESPath#

JMESPath یک زبان پرس و جو برای JSON است که می‌توانید از آن برای استخراج و تبدیل عناصر از یک سند JSON استفاده کنید. برای جزئیات کامل نحوه استفاده از JMESPath، به مستندات JMESPath مراجعه کنید.

متد jmespath()#

n98n یک متد سفارشی، jmespath() را ارائه می‌دهد. از این متد برای انجام جستجو روی یک شیء JSON با استفاده از زبان پرس و جوی JMESPath استفاده کنید.

سینتکس پایه به این صورت است:

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) پیروی می‌کنند. کتابخانه JavaScript JMESPath، که n98n از آن استفاده می‌کند، از search(object, searchString) پشتیبانی می‌کند. این بدان معناست که هنگام استفاده از مثال‌های مستندات JMESPath، ممکن است نیاز به تغییر ترتیب پارامترهای تابع جستجو داشته باشید.

وظایف رایج#

این بخش مثال‌هایی برای برخی عملیات رایج ارائه می‌دهد. مثال‌های بیشتر و راهنمایی‌های دقیق در مستندات خود JMESPath موجود است.

هنگام امتحان این مثال‌ها، باید حالت نود کد را روی اجرای یکبار برای هر مورد تنظیم کنید.

اعمال یک عبارت JMESPath به مجموعه‌ای از عناصر با پیش‌بینی‌ها#

از مستندات پیش‌بینی‌های JMESPath:

پیش‌بینی‌ها یکی از ویژگی‌های کلیدی JMESPath هستند. از آن برای اعمال یک عبارت به مجموعه‌ای از عناصر استفاده کنید. JMESPath از پنج نوع پیش‌بینی پشتیبانی می‌کند:

  • پیش‌بینی‌های لیست
  • پیش‌بینی‌های برش
  • پیش‌بینی‌های شیء
  • پیش‌بینی‌های مسطح‌سازی
  • پیش‌بینی‌های فیلتر

مثال زیر استفاده پایه از پیش‌بینی‌های لیست، برش و شیء را نشان می‌دهد. برای توضیحات دقیق هر نوع پیش‌بینی و مثال‌های بیشتر، به مستندات پیش‌بینی‌های JMESPath مراجعه کنید.

با توجه به این 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" )}}
// برمی‌گرداند ["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};
/* برمی‌گرداند:
[
	{
		"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}
"""
برمی‌گرداند:
[
 	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
"""

دریافت یک برش از نام‌های کوچک:

1
2
{{$jmespath($json.body.people, "[:2].first")}}
// برمی‌گرداند ["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};
/* برمی‌گرداند:
[
	{
		"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}
"""
برمی‌گرداند:
[
	{
		"firstTwoNames": [
		"James",
		"Jacob"
		]
	}
]
"""

دریافت لیستی از سن سگ‌ها با استفاده از پیش‌بینی‌های شیء:

1
2
{{$jmespath($json.body.dogs, "*.age")}}
// برمی‌گرداند [7,5]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
let dogsAges = $jmespath($json.body.dogs, "*.age");
return {dogsAges};
/* برمی‌گرداند:
[
	{
		"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}
"""
برمی‌گرداند:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
"""

انتخاب چندین عنصر و ایجاد یک لیست یا شیء جدید#

از چند انتخابی برای انتخاب عناصر از یک شیء JSON و ترکیب آن‌ها در یک لیست یا شیء جدید استفاده کنید.

با توجه به این 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]")}}
// برمی‌گرداند [["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};
/* برمی‌گرداند:
[
	{
		"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}
"""
برمی‌گرداند:
[
	{
		"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 را پیدا کنید و شناسه دسته آن را به من بگویید" انجام دهید.

1
{{ $jmespath($("Code").all(), "[?json.name=='Lenovo'].json.category_id") }}
این صفحه مفید بود؟