JSONPath로 중첩 JSON을 쿼리하는 방법 (루프 없이)
Source: Dev.to
위에 제공된 소스 링크 외에 번역할 텍스트가 포함되어 있지 않습니다. 번역을 원하는 본문을 알려주시면 한국어로 번역해 드리겠습니다.
Introduction
300줄짜리 API 응답을 방금 받았습니다. 3단계 중첩 구조 안 어딘가에 실제로 필요한 email 필드가 있습니다. API 스키마가 바뀔 때마다 중첩 루프를 작성하면 금방 깨지기 쉽습니다.
JSONPath는 XML의 XPath와 유사하게 JSON을 위한 간결하고 읽기 전용인 쿼리 언어를 제공합니다. 구문을 배우면 계속해서 사용하게 될 것입니다.
API 응답 예시
{
"store": {
"orders": [
{
"id": 1,
"customer": { "name": "Alice", "email": "alice@example.com" },
"items": [{ "sku": "A1", "qty": 2 }, { "sku": "B3", "qty": 1 }]
},
{
"id": 2,
"customer": { "name": "Bob", "email": "bob@example.com" },
"items": [{ "sku": "C7", "qty": 5 }]
}
]
}
}
모든 고객 이메일 가져오기
JSONPath 표현식
$.store.orders[*].customer.email
결과
["alice@example.com", "bob@example.com"]
$– 루트 요소.– 객체 키로 이동[*]– 모든 배열 요소
조건에 의한 필터링
qty가 1보다 큰 항목만 가져오려면:
표현식
$.store.orders[*].items[?(@.qty > 1)]
결과
[
{ "sku": "A1", "qty": 2 },
{ "sku": "C7", "qty": 5 }
]
?()– 필터 표현식@– 현재 노드
명시적 루프와 비교 (Python)
# Without JSONPath — five lines, easy to get wrong
results = []
for order in data["store"]["orders"]:
for item in order["items"]:
if item["qty"] > 1:
results.append(item)
JSONPath 버전은 한 줄의 자체 문서화된 코드입니다.
Recursive descent
키의 정확한 위치를 모를 때는 재귀 하강 연산자 ..를 사용하세요:
$..email
이렇게 하면 문서 내 모든 깊이에서 email 필드를 모두 찾을 수 있어, 익숙하지 않은 스키마를 탐색할 때 유용합니다.
실용적인 3단계 워크플로우
- Beautify – 응답을 JSON Beautifier에 붙여넣어 깔끔하고 들여쓰기된 모습을 얻으세요.
- Validate – JSON Validator를 사용해 실행하여 올바른 형식인지 확인하세요 (잘못된 페이로드는 빈 결과를 반환합니다).
- Query – JSONPath 도구(예: jsonindenter.com의 JSONPath Evaluator)를 사용해 표현식을 반복 조정하여 정확히 원하는 데이터를 추출하세요.
JSONPath syntax cheat sheet
| Symbol | Meaning |
|---|---|
$ | 루트 요소 |
.key | 자식 키 |
..key | 모든 깊이에서 key 재귀 검색 |
[*] | 모든 배열 요소 |
[0] | 첫 번째 요소 ([-1] – 마지막 요소) |
[0,2] | 인덱스 0 및 2의 요소 |
[?(@.price < 10)] | price가 10보다 작은 경우 필터 |
@.key | 현재 노드의 키 (필터 표현식 내부) |
구현 노트
- Python –
jsonpath-ng - JavaScript –
jsonpath-plus - Java – Jayway JSONPath
구현마다 약간씩 차이가 있습니다. RFC 9535(2024년 발표)는 표준화를 목표로 하고 있지만, 실제 코드에서는 사용 중인 특정 라이브러리에 대해 표현식을 테스트하는 것이 좋습니다.
When to use JSONPath vs. JSON Patch
JSONPath는 읽기 전용입니다: 데이터를 조회하고 추출합니다.
JSON 문서를 수정해야 할 경우(필드 추가, 교체 또는 삭제), JSON Patch(RFC 6902)를 사용하세요. 두 도구는 서로 보완합니다: JSONPath는 찾고, JSON Patch는 수정합니다.
결론
JSONPath는 복잡한 JSON 쿼리를 구성 가능하고 읽기 쉽게 만들어 줍니다. 잘 작성된 표현식은 의도를 한눈에 전달하는 반면, 중첩된 루프는 독자가 전체 블록을 모두 살펴봐야 추출을 이해하게 합니다. 동일한 표현식이 JavaScript, Python, Java 및 Postman과 같은 도구에서도 작동하기 때문에, JSONPath를 배우면 전체 스택에서 큰 도움이 됩니다.
참조된 무료 도구
- JSONPath Evaluator – 브라우저에서 JSONPath 표현식을 실시간으로 테스트합니다.
- JSON Beautifier – 원시 JSON을 포맷하여 쉽게 읽을 수 있게 합니다.
- JSON Validator – 쿼리하기 전에 JSON이 올바르게 형성되었는지 확인합니다.
- JSON Patch – RFC 6902 패치를 적용하여 JSON 구조를 제자리에서 수정합니다.