JSONPath는 경로를 이용해 JSON 문서에서 값을 뽑아내는 질의 언어로, XML에서 XPath가 하는 역할과 같다. 통합이 여전히 XML/SOAP 기반으로 남아 있는 한국의 공공기관이나 금융권 시스템을 다뤄본 개발자라면 이 문법이 낯설지 않을 것이다.
기본 문법
표현식은 항상 문서의 루트를 나타내는 $로 시작한다. 이후 필드는 점($.user.name)이나 대괄호($['user']['name'])로 접근하고, 배열 요소는 인덱스($.items[0])로 접근한다.
여러 값을 한 번에 선택하기
와일드카드 *는 특정 계층의 모든 요소를 선택하고, ..는 재귀적 탐색으로 정확한 경로를 몰라도 문서의 어떤 깊이에서든 필드를 찾아낸다. [?(@.price < 10)] 같은 필터는 프로그래밍 표현식과 비슷한 조건으로 배열 요소를 선택한다.
실무에서 쓰이는 이유
- 디버깅 중 큰 API 응답에서 특정 필드를 스크립트 없이 빠르게 뽑아낼 때.
- JSON 형식의 로그나 이벤트를 조건에 따라 즉시 필터링할 때.
- 파서를 직접 작성하지 않고 설정 파일에서 값을 읽어올 때.
JSONPath 대 XPath: 흔한 인덱스 착각
노드 인덱싱이 1부터 시작하는 XPath(book[1]이 첫 번째 요소)에 익숙한 사람은 인덱싱이 0부터 시작하는 JSONPath로 넘어올 때 자주 실수한다 — book[1]은 이미 두 번째 요소다. 이 차이 하나만으로도 오래된 XML/XPath 연동을 JSON API로 옮길 때 발생하는 버그의 상당 부분을 설명할 수 있다.
점이나 공백이 포함된 키
필드 이름 자체에 점, 하이픈, 공백이 들어 있다면(중첩된 필드가 아니라 "user.name"이라는 문자 그대로의 키인 경우), 점 표기법 $.user.name은 모호해진다 — 파서는 이를 중첩된 필드 user와 name으로 해석한다. 이런 경우 키는 따옴표를 붙인 대괄호로 감싸야 한다: $['user.name'].