JSON 데이터 조회하기

JSON 데이터 조회하기

n8n은 JMESPath 라이브러리를 지원해서 JSON 형식 데이터를 더 쉽게 다룰 수 있게 해 줍니다.

JMESPath는 JSON 문서에서 요소를 추출하고 변환하는 데 쓰는 JSON용 쿼리 언어예요. JMESPath 사용법의 전체 설명은 JMESPath 문서를 참고하세요.

jmespath() 메서드

n8n은 jmespath()라는 커스텀 메서드를 제공합니다. 이 메서드로 JMESPath 쿼리 언어를 사용해 JSON 객체를 검색할 수 있어요.

기본 문법은 다음과 같습니다.

$jmespath(object, searchString)

JavaScript 전용

Python Code 노드에는 $jmespath()가 없어요. Python에서 같은 결과를 얻으려면 표준 Python을 쓰면 됩니다. 아래의 각 예시에 Python 버전이 포함되어 있어요.

메서드가 무엇을 하는지 이해하기 쉽도록, 동등한 더 긴 JavaScript 코드를 보여 드릴게요.

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

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

이 더 긴 코드 예시는 한 줄이어야 하는 표현식에서는 동작하지 않아요.

object는 이전 노드의 출력 같은 JSON 객체이고, searchString은 JMESPath 쿼리 언어로 작성한 표현식이에요. JMESPath 명세에 지원되는 표현식 목록이 있고, TutorialExamples에 대화형 예시가 있습니다.

검색 파라미터 순서

JMESPath 명세의 예시들은 search(searchString, object) 순서를 따릅니다. n8n이 쓰는 JMESPath JavaScript 라이브러리는 대신 search(object, searchString)를 지원해요. 그래서 JMESPath 문서의 예시를 가져다 쓸 때는 검색 함수 파라미터의 순서를 바꿔야 할 수 있습니다.

흔한 작업

여기 흔한 작업 몇 가지의 예시를 모아 봤어요. 더 많은 예시와 상세한 안내는 JMESPath 자체 문서에 있습니다.

이 예시들을 시험해 볼 때는 Code 노드의 ModeRun Once for Each Item으로 설정해야 해요.

프로젝션으로 요소 모음에 JMESPath 표현식 적용하기

JMESPath 프로젝션 문서에서:

프로젝션은 JMESPath의 핵심 기능 중 하나예요. 요소 모음에 표현식을 적용할 때 씁니다. JMESPath는 다섯 종류의 프로젝션을 지원해요.

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

아래 예시는 list, slice, object 프로젝션의 기본 사용법을 보여 줘요. 각 프로젝션 유형의 자세한 설명과 더 많은 예시는 JMESPath 프로젝션 문서를 참고하세요.

웹훅 노드에서 이런 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) 목록을 가져옵니다.

표현식 (JavaScript)

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

Code 노드 (JavaScript)

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

Code 노드 (Python)

people = _item["json"]["body"]["people"]
first_names = [person["first"] for person in people]
return {"firstNames": first_names}
"""
Returns:
[
 	{
		"firstNames": [
			"James",
			"Jacob",
			"Jayden"
		]
	}
]
"""

이름 슬라이스를 가져옵니다.

표현식 (JavaScript)

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

Code 노드 (JavaScript)

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

Code 노드 (Python)

people = _item["json"]["body"]["people"]
first_two_names = [person["first"] for person in people[:2]]
return {"firstTwoNames": first_two_names}
"""
Returns:
[
	{
		"firstTwoNames": [
		"James",
		"Jacob"
		]
	}
]
"""

객체 프로젝션으로 강아지들의 나이 목록을 가져옵니다.

표현식 (JavaScript)

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

Code 노드 (JavaScript)

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

Code 노드 (Python)

dogs = _item["json"]["body"]["dogs"]
dogs_ages = [dog["age"] for dog in dogs.values()]
return {"dogsAges": dogs_ages}
"""
Returns:
[
	{
		"dogsAges": [
			7,
			5
		]
	}
]
"""

여러 요소를 선택해 새 목록이나 객체 만들기

Multiselect를 사용해 JSON 객체에서 요소를 선택하고 그것들을 새 목록이나 객체로 합칠 수 있어요.

웹훅 노드에서 이런 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
        }
      }
    }
  }
]

multiselect list를 사용해 이름과 성을 가져와 두 이름을 모두 담은 새 목록을 만듭니다.

표현식 (JavaScript)

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

Code 노드 (JavaScript)

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

Code 노드 (Python)

people = _item["json"]["body"]["people"]
new_list = [[person["first"], person["last"]] for person in people]
return {"newList": new_list}
"""
Returns:
[
	{
		"newList": [
			[
				"James",
				"Green"
			],
			[
				"Jacob",
				"Jones"
			],
			[
				"Jayden",
				"Smith"
			]
		]
	}
]
"""

표현식에서 화살표 함수의 대안

예를 들어 Code 노드에서 아래 코드를 반환해서 입력 데이터를 만들어 볼게요.

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