
JSON은 오늘날 가장 널리 사용되는 데이터 표현 형식 중 하나다.
REST API, 설정 파일, 로그, 메시지 큐 등 거의 모든 데이터 교환의 기본 단위로 쓰인다.
하지만 JSON이 복잡해질수록, 특정 필드만 찾아내거나 조건에 맞는 데이터를 추출하는 일이 점점 까다로워진다.
이럴 때 유용하게 쓸 수 있는 기술이 바로 JSONPath다.
SQL이 데이터베이스에서 원하는 값을 추출하는 질의 언어라면 JSONPath는 JSON 문서 안에서 값을 찾아내는 경로 질의 언어다.
JSONPath란 무엇인가
JSONPath는 JSON 데이터를 탐색하기 위한 표현식 언어다.
XPath가 XML을 탐색하듯이 JSONPath는 JSON의 계층 구조를 탐색한다.
간단히 말해,
- $.store.book[0].title → 루트($)에서 store → book 배열 → 첫 번째 객체의 title 값을 가져온다.
- $.store.book[*].author → 모든 책 객체의 author 필드를 반환한다.
이처럼 JSONPath는 중첩된 구조를 쉽게 탐색할 수 있도록 도와준다.
JSONPath 문법 요약
| Expression | Description |
| $ | 루트 객체 |
| @ | 현재 노드 |
| . 또는 [] | 하위 요소 접근 |
| * | 모든 요소 선택 |
| [n] | n번째 요소 선택 (0부터 시작) |
| [start:end] | 슬라이스 선택 |
| ?() | 조건 필터링 |
| , | 여러 항목 선택 |
예를 들어, 다음 JSON 데이터가 있다고 하자.
{
"store": {
"book": [
{ "category": "fiction", "title": "1984", "price": 8.99 },
{ "category": "fiction", "title": "Animal Farm", "price": 5.99 },
{ "category": "non-fiction", "title": "Sapiens", "price": 12.99 }
],
"bicycle": { "color": "red", "price": 19.95 }
}
}
여기서 다음과 같은 질의가 가능하다.
| JSONPath | Result |
| $.store.book[*].title | ["1984", "Animal Farm", "Sapiens"] |
| $.store.book[?(@.price < 10)].title | ["1984", "Animal Farm"] |
| $..price | [8.99, 5.99, 12.99, 19.95] |
| $.store..price | 동일 결과 (..은 중첩된 모든 price 탐색) |
조건식과 연산자
JSONPath의 강력한 기능 중 하나는 조건식(?())을 통한 필터링이다.
@는 현재 노드를 가리키며, 비교 연산자나 논리 연산자와 함께 사용할 수 있다.
| Operator | Description | Example |
| <, <=, >, >=, ==, != | 비교 연산 | @.price < 10 |
| &&, || | 논리 연산 | @.price < 10 && @.category == 'fiction' |
| =~ | 정규식 일치 | @.title =~ /.*Farm.*/ |
예시:
$.store.book[?(@.price < 10 && @.category == 'fiction')].title
→ ["1984", "Animal Farm"]
이런 필터는 JSON을 순회하지 않고도 필요한 데이터만 추출할 수 있게 해 준다.
중첩 탐색(..)
.. 연산자는 JSON의 모든 하위 노드를 깊이 탐색한다.
예를 들어, $.store..price는 store 내부의 모든 price 필드를 반환한다.
중첩된 구조에서 특정 키를 전역 검색하듯 사용할 수 있어,
API 응답처럼 깊은 계층을 가진 JSON을 다룰 때 매우 유용하다.
JSONPath의 장점
- 간결한 탐색 표현
중첩 구조를 단 한 줄의 경로 표현식으로 접근할 수 있다. 기존에는 key 값으로 중첩된 JSON Object를 하나씩 끌어내어 값을 가져와야 했다면 JSON Path를 이용하면 중첩된 모든 JSON Object에 접근하지 않아도 간결하게 값을 찾을 수 있다. - 조건 필터링 지원
단순 값을 가져오는 표현식이 아니고 조건을 함께 명시하여 값을 가져올 수 있다. 기존에는 JSON Object를 순회하며 if 문을 이용해 필터링하였지만 JSON Path의 조건 필터링을 이용하면 한 줄로 필터링과 동시에 값을 가져올 수도 있다. - 언어 독립성
JSONPath는 특정 언어에 종속되지 않으며, Java, Python, Go, JavaScript 등에서 동일한 문법으로 사용할 수 있다. - 효율적인 데이터 접근
전체 JSON을 순회할 필요 없이 필요한 경로만 탐색한다.
Java에서의 JSONPath 사용
JSON Path를 자바에서 실제로 사용해보고자 한다.
Java에서는 일반적으로 Jayway JSONPath 라이브러리를 사용한다.
게시글 작성일(2025. 11. 04) 기준 최신 버전인 2.10.0 버전을 사용하였다.
build.gradle 파일에 json-path 라이브러리를 추가한다.
dependencies {
implementation 'com.jayway.jsonpath:json-path:2.10.0'
}
메인 메서드는 아래와 같이 작성하였다.
import com.jayway.jsonpath.JsonPath;
import java.util.List;
public class JsonPathExample {
public static void main(String[] args) {
String json = """
{
"store": {
"book": [
{ "category": "fiction", "title": "1984", "price": 8.99 },
{ "category": "fiction", "title": "Animal Farm", "price": 5.99 },
{ "category": "non-fiction", "title": "Sapiens", "price": 12.99 }
],
"bicycle": { "color": "red", "price": 19.95 }
}
}
""";
List<String> titles = JsonPath.read(json, "$.store.book[*].title");
System.out.println("모든 책 제목: " + titles);
List<String> cheapBooks = JsonPath.read(json, "$.store.book[?(@.price < 10)].title");
System.out.println("저렴한 책: " + cheapBooks);
List<Double> prices = JsonPath.read(json, "$..price");
System.out.println("가격 목록: " + prices);
}
}
실행 결과는 아래와 같다.
모든 책 제목: [1984, Animal Farm, Sapiens]
저렴한 책: [1984, Animal Farm]
가격 목록: [8.99, 5.99, 12.99, 19.95]
'Programming Note' 카테고리의 다른 글
| XML과 HTML의 차이 (0) | 2025.11.03 |
|---|---|
| 리눅스에서 Protocol Buffer(protoc) 설치 (0) | 2025.11.01 |
| gRPC란 무엇인가 (0) | 2025.10.30 |
| 다른 드라이브(파티션)에 WSL 설치하기 (0) | 2025.09.08 |
| 내 컴퓨터 CPU 아키텍처 확인하기 (Windows, Linux/macOS) (0) | 2025.09.08 |














