Projections
JMESPath의 주요 기능 중 하나로, 요소의 집합에 식을 적용할 수 있게 한다. Projections 종류는 5가지로 나눌 수 있다.
- List Projections
- Slice Projections
- Object Projections
- Flatten Projections
- Filter Projections
2022.09.27 - [JMESPath] Projections에 이어서 살펴보도록 하자.
List and Slice Projections
List Projections은 와일드카드 표현식에 의해 만들어진 JSON 배열에 적용된다.
# JSON
{
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
위의 JSON 데이터에서 people.first에 해당하는 값만 출력하려고 한다. 이 경우에는 people[*]로 first, last로 구성된 JSON 배열로 접근한 뒤,
# people[*]
[
{
"first": "James",
"last": "d"
},
{
"first": "Jacob",
"last": "e"
},
{
"first": "Jayden",
"last": "f"
},
{
"missing": "different"
}
]
각 배열의 first 식별자를 취하면 된다.
# people[*].first
[
"James",
"Jacob",
"Jayden"
]
슬라이싱을 적용하면 다음과 같다.
# people[:2].first
[
"James",
"Jacob"
]
Object Projections
Object Projections은 JSON 객체에 정의된다.
# JSON
{
"ops": {
"functionA": {"numArgs": 2},
"functionB": {"numArgs": 3},
"functionC": {"variadic": true}
}
}
위의 JSON 데이터에서 ops 아래 모든 function의 numArgs 값을 출력하려고 한다. 이 경우에는 먼저 ops.*로 접근하여 다음과 같은 JSON 배열을 얻을 수 있다.
# ops.*
[
{
"numArgs": 2
},
{
"numArgs": 3
},
{
"variadic": true
}
]
각 배열의 numArgs 값만 취하면 된다.
# ops.*.numArgs
[
2,
3
]
Flatten Projections
List, Object Projections의 결과는 원본 JSON 데이터 구조를 유지하는데, 이 구조를 한 단계 평면화할 때 사용한다.
# JSON
{
"reservations": [
{
"instances": [
{"state": "running"},
{"state": "stopped"}
]
},
{
"instances": [
{"state": "terminated"},
{"state": "running"}
]
}
]
}
위의 JSON 데이터에서 List Projection을 이용해 state 값만 출력하는 표현식과 그 결과는 아래와 같다.
# reservations[*].instances[*].state
[
[
"running",
"stopped"
],
[
"terminated",
"running"
]
]
깊이가 2인 배열이 결과로 나오는데, 이를 깊이가 1인 배열로 바꾸고 싶다면 [*] 대신 []를 사용하면 된다.
# reservations[*].instances[].state
[
"running",
"stopped",
"terminated",
"running"
]
Filter Projections
Filter Projections을 사용하면 원하는 키와 값으로 조건을 주어 데이터를 필터링할 수 있다. 필터링 시에는 [?key comparator value] 형식으로 작성한다.
# JSON
{
"machines": [
{"name": "a", "state": "running"},
{"name": "b", "state": "stopped"},
{"name": "b", "state": "running"}
]
}
예로 들어 위의 machines 데이터에서 state가 running인 객체의 name 값을 출력하고자 한다. 이 경우에는 [?state=='running']이 필터 조건이 된다.
# machines[?state=='running'].name
[
"a",
"b"
]
조건 연산자는 ==, !=, <, <=, >, >=가 올 수 있다.
참고 문서
https://jmespath.org/tutorial.html