기타

[JMESPath] JSON 쿼리 기본 - 1

비번변경 2022. 9. 26. 22:02

JMESPath

JMESPath 로고

JMESPath는 JSON 쿼리 언어로, JSON 데이터에서 요소를 추출하고 변환할 수 있다. Python, PHP, JavaScript, Ruby, Lua, Go 등을 지원한다.

 

aws cli의 --query 옵션에서 사용하는데, 이 글에서는 간단히 문법을 정리해두려고 한다.

 

 

기본 표현식

JMESPath는 JSON의 키를 이용해 값을 식별한다.

# JSON
{
  "a": "foo",
  "b": "bar",
  "c": "baz"
}

# 표현식
b

# 결과
bar

 

하위 표현식

하위 요소는 .을 이용해 접근한다.

# JSON
{
  "a": {
    "b": {
      "c": {
        "d": "value"
      }
    }
  }
}

# 표현식
a.b.c.d

# 결과
value

존재하지 않는 키를 참조하면 null을 반환한다.

 

인덱스 표현식

배열은 대괄호([]) 내 인덱스로 값을 선택할 수 있다. 인덱스는 0부터 시작한다. -1은 마지막 요소를 나타낸다.

# JSON
["a", "b", "c", "d", "e", "f"]

# 표현식
[0]

# 결과
a

 

+ 아래의 JSON에서 결괏값으로 2를 받고 싶을 때의 표현식은?

{"a": {
  "b": {
    "c": [
      {"d": [0, [1, 2]]},
      {"d": [3, 4]}
    ]
  }
}}

더보기
a.b.c[0].d[1][1]

 

슬라이싱

Python의 배열 슬라이싱과 비슷하다. [start:end:step]의 형태로 작성할 수 있다. step이 음수이면 역순으로 배열된다.

# JSON
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 표현식
[1::2]

# 결과
[
  1,
  3,
  5,
  7,
  9
]

 

와일드카드 표현식

* 또는 [*]로 표현되며, 여러 요소를 반환할 수 있다. 후속 표현식은 반환된 개별 요소에 적용된다. 

 

N개 요소를 가진 배열과 [*].child-expr라는 표현식이 주어진 경우,

[*].child-expr의 결과는 [child-expr(el-0), child-expr(el-2), ..., child-expr(el-N)] 가 된다.

 

이를 Projection이라고 하며, 표현식 child-expr은 결과 목록의 요소에 투영된다.

[*]는 배열 와일드카드 표현식이라고 하며 JSON 배열에서만 유효하다. 다른 JSON 유형에 적용되면 null이 반환된다.

 

 

참고 문서

https://jmespath.org/tutorial.html