모ダン 웹 개발에서 JSON(JavaScript Object Notation)은 데이터 교환의 표준 형식으로 사용되고 있습니다. 그 간결함과 쉬운 가독성으로 인해 널리 환영받고 있지만, 데이터 구조가 복잡해지면서 필요한 정보를 효과적으로 추출하는 방법은 개발자들에게 과제가 되고 있습니다. 이에 JSONPath가 등장했습니다. JSONPath는 JSON 데이터에서 정보를 추출하는 데 도움을 주는 강력한 검색 도구로, 사용자들이 JSON 문서 내부의 데이터를 쉽게 추출할 수 있도록 합니다.
1. JSONPath란 무엇인가?
JSONPath는 JSON 데이터를 위한 쿼리 언어로, XML에서 XPath를 사용하는 것과 유사합니다. 이 언어는 사용자들에게 JSON 문서 내부의 데이터를 탐색하고 추출하는 데에 사용할 수 있는 类路径 구문을 제공합니다. JSONPath의 문법은 간결하고 직관적이기 때문에 복잡한 쿼리도 쉽게 수행할 수 있습니다.
2. JSONPath의 기본 문법
JSONPath는 다음과 같은 문법 요소들을 통해 데이터를 검색합니다:
$: 루트 요소를 나타냅니다..: 자식 요소에 접근합니다.[]: 배열 요소를 접근하거나 필터링합니다.*: 모든 요소를 나타내는 와일드카드입니다...: 모든 하위 요소를 검색합니다.?(): 필터링 조건을 지정합니다.
3. JSONPath의 장점
- 간결함 : JSONPath의 문법은 간결하고 쉬워 누구나 쉽게 배울 수 있습니다.
- 유연성 : 복잡한 쿼리와 필터링 작업을 지원하며 다양한 JSON 구조를 처리할 수 있습니다.
- 넓은 호환성 : 여러 프로그래밍 언어와 도구에서 지원되고 플랫폼 간의 통합 솔루션으로서 사용할 수 있습니다.
4. 코드 예제
4.1. 종속성 추가
Maven을 사용 중이라면 다음 의존성을 pom.xml에 추가할 수 있습니다:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.8.0</version>
</dependency>
4.2. JsonPath를 사용하여 JSON 분석
다음과 같은 JSON 데이터를 가정합니다:
{
"store": {
"book": [
{
"category": "fiction",
"title": "The Great Gatsby",
"price": 10.99
},
{
"category": "non-fiction",
"title": "Sapiens",
"price": 15.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
다음은 JSONPath를 사용하여 데이터를 추출하는 예제 코드입니다:
package kr.json;
import com.jayway.jsonpath.JsonPath;
import java.util.List;
public class JSONPathExample {
public static void main(String[] args) {
String jsonData = "{ \"store\": { \"book\": [ { \"category\": \"fiction\", \"title\": \"The Great Gatsby\", \"price\": 10.99 }, { \"category\": \"non-fiction\", \"title\": \"Sapiens\", \"price\": 15.99 } ], \"bicycle\": { \"color\": \"red\", \"price\": 19.95 } } }";
// 모든 책 제목 추출
List<String> titles = JsonPath.read(jsonData, "$.store.book[*].title");
System.out.println("책 제목: " + titles);
// 15보다 싼 책 추출
List<Object> discountBooks = JsonPath.read(jsonData, "$.store.book[?(@.price < 15)]");
System.out.println("할인 책: " + discountBooks);
// 스토어 내 모든 가격 추출
List<Double> prices = JsonPath.read(jsonData, "$.store..price");
System.out.println("가격: " + prices);
}
}
4.3. 분석 결과
- 모든 책 제목 추출 :
$.store.book[*].title경로를 사용하여 모든 책의 제목을 반환합니다. - 15보다 싼 책 추출 :
$.store.book[?(@.price < 15)]경로를 사용하여 15보다 싼 책을 반환합니다. - 스토어 내 모든 가격 추출 :
$.store..price경로를 사용하여 스토어 내 모든 가격을 반환합니다.
더 많은 코드 예제는 아래 저장소에서 확인할 수 있습니다.
코드 저장소
- (jsonpath)
5. 테스트
- 모든 책 제목 추출 :
- JSONPath:
$.store.book[*].title - 결과:
["The Great Gatsby", "Sapiens"] - 15보다 싼 책 추출 :
- JSONPath:
$.store.book[?(@.price < 15)] - 결과:
[{"category": "fiction", "title": "The Great Gatsby", "price": 10.99}] - 스토어 내 모든 가격 추출 :
- JSONPath:
$.store..price - 결과:
[10.99, 15.99, 19.95]