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