JSONPath
Proxyman에서 JSONPath로 JSON 요청 및 응답 본문을 쿼리하는 방법을 알아봅니다. 문법, 필터 연산자, 바로 복사해 쓸 수 있는 경로 예시를 함께 살펴봅니다.
1. 무엇인가요?
JSONPath는 JSON 데이터를 빠르게 필터링하는 쿼리 언어입니다. Proxyman에서는 JSON 탭, Treeview 탭, 사용자 지정 컬럼에서 JSONPath를 사용할 수 있습니다.

2. 사용 방법
- Request 또는 Response 패널에서 + 버튼을 클릭합니다
- JSON을 선택해 JSON 탭을 추가합니다
- JSON 본문 위에 필터 바가 나타납니다
- JSON Path 또는 jq 필터 모드를 선택합니다
3. 문법
| 연산자 | 설명 |
|---|---|
$ | 쿼리를 시작하는 루트 요소입니다. 모든 경로 표현식은 이 요소에서 시작합니다. |
@ | 필터 조건식이 처리하고 있는 현재 노드입니다. |
* | 와일드카드입니다. 이름이나 숫자가 필요한 곳이면 어디에서든 사용할 수 있습니다. |
.. | 깊은 탐색(deep scan)입니다. 이름이 필요한 곳이면 어디에서든 사용할 수 있습니다. |
.<name> | 점(.) 표기법으로 지정하는 자식 노드 |
['<name>' (, '<name>')] | 대괄호 표기법으로 지정하는 자식 노드 또는 여러 자식 노드 |
[<number> (, <number>)] | 배열 인덱스 또는 여러 인덱스 |
[start:end] | 배열 슬라이스 연산자 |
[?(<expression>)] | 필터 표현식. 표현식은 불리언 값으로 평가되어야 합니다. |
필터 연산자
필터는 배열을 걸러내는 데 쓰이는 논리 표현식입니다. 일반적인 필터는 [?(@.age > 18)]와 같은 형태이며, 여기서 @는 처리 중인 현재 항목을 나타냅니다.
| 연산자 | 설명 |
|---|---|
| == | 왼쪽 값이 오른쪽 값과 같습니다 (1은 '1'과 같지 않습니다) |
| != | 왼쪽 값이 오른쪽 값과 같지 않습니다 |
| < | 왼쪽 값이 오른쪽 값보다 작습니다 |
| <= | 왼쪽 값이 오른쪽 값보다 작거나 같습니다 |
| > | 왼쪽 값이 오른쪽 값보다 큽니다 |
| >= | 왼쪽 값이 오른쪽 값보다 크거나 같습니다 |
| =~ | 왼쪽 값이 정규식과 일치합니다 [?(@.name =~ /foo.*?/i)] |
| in | 왼쪽 값이 오른쪽에 존재합니다 [?(@.size in ['S', 'M'])] |
| nin | 왼쪽 값이 오른쪽에 존재하지 않습니다 |
| subsetof | 왼쪽 값이 오른쪽의 부분 집합입니다 [?(@.sizes subsetof ['S', 'M', 'L'])] |
| anyof | 왼쪽 값과 오른쪽 값에 교집합이 있습니다 [?(@.sizes anyof ['M', 'L'])] |
| noneof | 왼쪽 값과 오른쪽 값에 교집합이 없습니다 [?(@.sizes noneof ['M', 'L'])] |
| size | 왼쪽 값(배열 또는 문자열)의 크기가 오른쪽 값과 같아야 합니다 |
| empty | 왼쪽 값(배열 또는 문자열)이 비어 있어야 합니다 |
경로 예시
다음 JSON 데이터를 예로 들겠습니다.
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
| JsonPath | 결과 |
|---|---|
| $.store.book[*].author | 모든 책의 저자 |
| $..author | 모든 저자 |
| $.store.* | 책과 자전거를 포함한 모든 항목 |
| $.store..price | 모든 항목의 가격 |
| $..book[2] | 세 번째 책 |
| $..book[-2] | 뒤에서 두 번째 책 |
| $..book[0,1] | 처음 두 권의 책 |
| $..book[:2] | 인덱스 0(포함)부터 인덱스 2(제외)까지의 모든 책 |
| $..book[1:2] | 인덱스 1(포함)부터 인덱스 2(제외)까지의 모든 책 |
| $..book[-2:] | 마지막 두 권의 책 |
| $..book[2:] | 인덱스 2(포함)부터 끝까지의 모든 책 |
| $..book[?(@.isbn)] | ISBN 번호가 있는 모든 책 |
| $.store.book[?(@.price < 10)] | 가격이 10보다 저렴한 상점의 모든 책 |
| $..book[?(@.price <= $['expensive'])] | 'expensive'가 아닌 상점의 모든 책 |
| $..book[?(@.author =~ /.*REES/i)] | 정규식(대소문자 무시)과 일치하는 모든 책 |
| $..* | 모든 항목 가져오기 |
| $..book.length() | 책의 개수 |