InfoGrab DocsInfoGrab Docs

JMESPath로 JSON 쿼리하기

요약

JMESPath는 JSON 문서에서 요소를 추출하고 변환하는 데 사용할 수 있는 JSON용 쿼리 언어입니다. n8n은 사용자 지정 메서드인 jmespath()를 제공합니다. 이 메서드가 하는 일을 이해하는 데 도움이 되도록, 이에 해당하는 더 긴 JavaScript 코드는 다음과 같습니다:

JMESPath는 JSON 문서에서 요소를 추출하고 변환하는 데 사용할 수 있는 JSON용 쿼리 언어입니다. JMESPath 사용 방법에 대한 전체 세부 정보는 JMESPath 문서를 참고하세요.

jmespath() 메서드#

n8n은 사용자 지정 메서드인 jmespath()를 제공합니다. 이 메서드를 사용하면 JMESPath 쿼리 언어로 JSON 객체를 검색할 수 있습니다.

기본 구문은 다음과 같습니다:

JavaScript

$jmespath(object, searchString)

Python

_jmespath(object, searchString)

이 메서드가 하는 일을 이해하는 데 도움이 되도록, 이에 해당하는 더 긴 JavaScript 코드는 다음과 같습니다:

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

표현식은 한 줄이어야 합니다

위의 더 긴 코드 예시는 Expressions에서 동작하지 않습니다. Expressions는 한 줄이어야 하기 때문입니다.

object는 이전 노드의 출력과 같은 JSON 객체입니다. searchString은 JMESPath 쿼리 언어로 작성된 표현식입니다. JMESPath 사양(Specification)에서 지원되는 표현식 목록을 확인할 수 있으며, TutorialExamples에서는 대화형 예시를 제공합니다.

Warning

검색 매개변수 순서

JMESPath 사양(Specification)의 예시들은 search(searchString, object) 패턴을 따릅니다. n8n이 사용하는 JMESPath JavaScript 라이브러리는 대신 search(object, searchString)을 지원합니다. 즉, JMESPath 문서의 예시를 사용할 때는 검색 함수 매개변수의 순서를 바꿔야 할 수 있습니다.

일반적인 작업#

이 섹션에서는 몇 가지 일반적인 작업의 예시를 제공합니다. 더 많은 예시와 상세한 안내는 JMESPath 자체 문서에서 확인할 수 있습니다.

이 예시들을 직접 실행해 보려면 Code node의 ModeRun Once for Each Item으로 설정해야 합니다.

프로젝션(projections)을 사용해 요소 컬렉션에 JMESPath 표현식 적용하기#

JMESPath 프로젝션 문서에서 발췌:

프로젝션은 JMESPath의 핵심 기능 중 하나입니다. 요소 컬렉션에 표현식을 적용할 때 사용합니다. JMESPath는 다섯 가지 종류의 프로젝션을 지원합니다:

  • 리스트 프로젝션(List Projections)
  • 슬라이스 프로젝션(Slice Projections)
  • 오브젝트 프로젝션(Object Projections)
  • 플래튼 프로젝션(Flatten Projections)
  • 필터 프로젝션(Filter Projections)

다음 예시는 리스트, 슬라이스, 오브젝트 프로젝션의 기본 사용법을 보여줍니다. 각 프로젝션 유형에 대한 상세한 설명과 더 많은 예시는 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
        }
      }
    }
  }
]

모든 사람의 이름(first name)에 대한 리스트를 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[*].first" )}}
// Returns ["James", "Jacob", "Jayden"]

Code node (JavaScript)

let firstNames = $jmespath($json.body.people, "[*].first" )
return {firstNames};
/* Returns:
[
	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
*/

Code node (Python)

firstNames = _jmespath(_json.body.people, "[*].first" )
return {"firstNames":firstNames}
"""
Returns:
[
 	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
"""

이름(first name)의 슬라이스를 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[:2].first")}}
// Returns ["James", "Jacob"]

Code node (JavaScript)

let firstTwoNames = $jmespath($json.body.people, "[:2].first");
return {firstTwoNames};
/* Returns:
[
	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
*/

Code node (Python)

firstTwoNames = _jmespath(_json.body.people, "[:2].first" )
return {"firstTwoNames":firstTwoNames}
"""
Returns:
[
	{
		"firstTwoNames": [
		"James",
		"Jacob"
		]
	}
]
"""

오브젝트 프로젝션을 사용하여 개들의 나이 목록을 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.dogs, "*.age")}}
// Returns [7,5]

Code node (JavaScript)

let dogsAges = $jmespath($json.body.dogs, "*.age");
return {dogsAges};
/* Returns:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
*/

Code node (Python)

dogsAges = _jmespath(_json.body.dogs, "*.age")
return {"dogsAges": dogsAges}
"""
Returns:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
"""

여러 요소를 선택하여 새 리스트나 오브젝트 만들기#

Multiselect를 사용하면 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
        }
      }
    }
  }
]

멀티셀렉트 리스트를 사용하여 이름(first)과 성(last)을 가져오고, 두 이름을 모두 담은 새 리스트를 만듭니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[].[first, last]")}}
// Returns [["James","Green"],["Jacob","Jones"],["Jayden","Smith"]]

Code node (JavaScript)

let newList = $jmespath($json.body.people, "[].[first, last]");
return {newList};
/* Returns:
[
	{
		"newList": [
			[
				"James",
				"Green"
			],
			[
				"Jacob",
				"Jones"
			],
			[
				"Jayden",
				"Smith"
			]
		]
	}
]
*/

Code node (Python)

newList = _jmespath(_json.body.people, "[].[first, last]")
return {"newList":newList}
"""
Returns:
[
	{
		"newList": [
			[
				"James",
				"Green"
			],
			[
				"Jacob",
				"Jones"
			],
			[
				"Jayden",
				"Smith"
			]
		]
	}
]
"""

Expressions에서 화살표 함수(arrow function)의 대안#

예를 들어, Code node에서 아래 코드를 반환하여 입력 데이터를 생성합니다:

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

"name이 Lenovo인 항목을 찾아서 그 category ID를 알려줘"와 같은 검색을 다음과 같이 수행할 수 있습니다.

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

JMESPath로 JSON 쿼리하기

n8n v2.29
원문 보기
요약

JMESPath는 JSON 문서에서 요소를 추출하고 변환하는 데 사용할 수 있는 JSON용 쿼리 언어입니다. n8n은 사용자 지정 메서드인 jmespath()를 제공합니다. 이 메서드가 하는 일을 이해하는 데 도움이 되도록, 이에 해당하는 더 긴 JavaScript 코드는 다음과 같습니다:

JMESPath는 JSON 문서에서 요소를 추출하고 변환하는 데 사용할 수 있는 JSON용 쿼리 언어입니다. JMESPath 사용 방법에 대한 전체 세부 정보는 JMESPath 문서를 참고하세요.

jmespath() 메서드#

n8n은 사용자 지정 메서드인 jmespath()를 제공합니다. 이 메서드를 사용하면 JMESPath 쿼리 언어로 JSON 객체를 검색할 수 있습니다.

기본 구문은 다음과 같습니다:

JavaScript

$jmespath(object, searchString)

Python

_jmespath(object, searchString)

이 메서드가 하는 일을 이해하는 데 도움이 되도록, 이에 해당하는 더 긴 JavaScript 코드는 다음과 같습니다:

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

표현식은 한 줄이어야 합니다

위의 더 긴 코드 예시는 Expressions에서 동작하지 않습니다. Expressions는 한 줄이어야 하기 때문입니다.

object는 이전 노드의 출력과 같은 JSON 객체입니다. searchString은 JMESPath 쿼리 언어로 작성된 표현식입니다. JMESPath 사양(Specification)에서 지원되는 표현식 목록을 확인할 수 있으며, TutorialExamples에서는 대화형 예시를 제공합니다.

Warning

검색 매개변수 순서

JMESPath 사양(Specification)의 예시들은 search(searchString, object) 패턴을 따릅니다. n8n이 사용하는 JMESPath JavaScript 라이브러리는 대신 search(object, searchString)을 지원합니다. 즉, JMESPath 문서의 예시를 사용할 때는 검색 함수 매개변수의 순서를 바꿔야 할 수 있습니다.

일반적인 작업#

이 섹션에서는 몇 가지 일반적인 작업의 예시를 제공합니다. 더 많은 예시와 상세한 안내는 JMESPath 자체 문서에서 확인할 수 있습니다.

이 예시들을 직접 실행해 보려면 Code node의 ModeRun Once for Each Item으로 설정해야 합니다.

프로젝션(projections)을 사용해 요소 컬렉션에 JMESPath 표현식 적용하기#

JMESPath 프로젝션 문서에서 발췌:

프로젝션은 JMESPath의 핵심 기능 중 하나입니다. 요소 컬렉션에 표현식을 적용할 때 사용합니다. JMESPath는 다섯 가지 종류의 프로젝션을 지원합니다:

  • 리스트 프로젝션(List Projections)
  • 슬라이스 프로젝션(Slice Projections)
  • 오브젝트 프로젝션(Object Projections)
  • 플래튼 프로젝션(Flatten Projections)
  • 필터 프로젝션(Filter Projections)

다음 예시는 리스트, 슬라이스, 오브젝트 프로젝션의 기본 사용법을 보여줍니다. 각 프로젝션 유형에 대한 상세한 설명과 더 많은 예시는 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
        }
      }
    }
  }
]

모든 사람의 이름(first name)에 대한 리스트를 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[*].first" )}}
// Returns ["James", "Jacob", "Jayden"]

Code node (JavaScript)

let firstNames = $jmespath($json.body.people, "[*].first" )
return {firstNames};
/* Returns:
[
	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
*/

Code node (Python)

firstNames = _jmespath(_json.body.people, "[*].first" )
return {"firstNames":firstNames}
"""
Returns:
[
 	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
"""

이름(first name)의 슬라이스를 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[:2].first")}}
// Returns ["James", "Jacob"]

Code node (JavaScript)

let firstTwoNames = $jmespath($json.body.people, "[:2].first");
return {firstTwoNames};
/* Returns:
[
	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
*/

Code node (Python)

firstTwoNames = _jmespath(_json.body.people, "[:2].first" )
return {"firstTwoNames":firstTwoNames}
"""
Returns:
[
	{
		"firstTwoNames": [
		"James",
		"Jacob"
		]
	}
]
"""

오브젝트 프로젝션을 사용하여 개들의 나이 목록을 가져옵니다:

Expressions (JavaScript)

{{$jmespath($json.body.dogs, "*.age")}}
// Returns [7,5]

Code node (JavaScript)

let dogsAges = $jmespath($json.body.dogs, "*.age");
return {dogsAges};
/* Returns:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
*/

Code node (Python)

dogsAges = _jmespath(_json.body.dogs, "*.age")
return {"dogsAges": dogsAges}
"""
Returns:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
"""

여러 요소를 선택하여 새 리스트나 오브젝트 만들기#

Multiselect를 사용하면 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
        }
      }
    }
  }
]

멀티셀렉트 리스트를 사용하여 이름(first)과 성(last)을 가져오고, 두 이름을 모두 담은 새 리스트를 만듭니다:

Expressions (JavaScript)

{{$jmespath($json.body.people, "[].[first, last]")}}
// Returns [["James","Green"],["Jacob","Jones"],["Jayden","Smith"]]

Code node (JavaScript)

let newList = $jmespath($json.body.people, "[].[first, last]");
return {newList};
/* Returns:
[
	{
		"newList": [
			[
				"James",
				"Green"
			],
			[
				"Jacob",
				"Jones"
			],
			[
				"Jayden",
				"Smith"
			]
		]
	}
]
*/

Code node (Python)

newList = _jmespath(_json.body.people, "[].[first, last]")
return {"newList":newList}
"""
Returns:
[
	{
		"newList": [
			[
				"James",
				"Green"
			],
			[
				"Jacob",
				"Jones"
			],
			[
				"Jayden",
				"Smith"
			]
		]
	}
]
"""

Expressions에서 화살표 함수(arrow function)의 대안#

예를 들어, Code node에서 아래 코드를 반환하여 입력 데이터를 생성합니다:

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

"name이 Lenovo인 항목을 찾아서 그 category ID를 알려줘"와 같은 검색을 다음과 같이 수행할 수 있습니다.

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