JSONPath는 XPath가 XML용인 방식과 마찬가지로 JSON용 쿼리 언어입니다. 즉, 중첩 루프를 작성하는 대신 노드를 가리킵니다. 대부분의 경우 `$`, `@`, 점, 괄호, `*`, `..`, 슬라이스 및 간단한 `[?()]` 필터와 같은 소수의 토큰만 필요합니다. 이 가이드는 전체 RFC 복제본이 아닌 짧은 목록입니다. 아래 샘플을 JSONPath Tester에 붙여넣고 브라우저에서 각 표현식을 시도해 보세요. 아무 것도 업로드되지 않습니다.
빠른 답변
모든 경로는 '$'(문서 루트)로 시작합니다. 현재 항목의 필터 안에 `@`를 사용하세요. 일상 업무에는 `$.store.book[*].title`을 선호합니다. 키에 공백이나 예약 문자가 있는 경우 `$['store']['book'][0]`을 사용하세요. `$..author`는 모든 깊이의 필드를 찾습니다. 필터는 `$.store.book[?(@.price < 10)]`와 같습니다. RFC 9535를 현대 방언으로 취급하고 오래된 Goessner 샘플을 검증할 때까지 민간 전승으로 취급하십시오.
하나의 샘플 페이로드
아래의 모든 예제는 고전적인 서점 문서(많은 JSONPath 튜토리얼이 공유하는 것과 동일한 모양)를 사용합니다. 읽는 동안 열어두세요:
- `store.book` - `카테고리`, `저자`, `제목`, `가격`, 때로는 `isbn`이 포함된 개체 배열입니다.
- `store.bicycle` - `color`와 `price`가 포함된 중첩 개체입니다.
- 페이로드가 한 줄로 도착했다면 먼저 JSON Minifier & Formatter를 사용하여 예쁘게 인쇄한 다음 쿼리하세요.
$ 및 @
`$`는 붙여넣은 JSON 값(전체 개체 또는 배열)의 루트입니다. 모든 유용한 표현은 거기서 시작됩니다. `@`는 필터 내에서만 의미가 있습니다. 즉, "현재 테스트 중인 요소"를 의미합니다. 필터 외부 `@`는 자유 부동 커서가 아닙니다.
- `$` - 문서 루트.
- `[?()]` 내부 `@.price` - 테스트 중인 항목의 `price` 필드입니다.
- `$.store.book[?(@.isbn)]` - `isbn` 키(존재 확인)가 있는 책.
- `$`가 없는 단순 경로는 일반적으로 엄격한 테스터에 의해 거부됩니다. 항상 `$`로 시작됩니다.
도트 대 괄호
점 표기법은 간단한 식별자 `$.store.book`을 줄여서 표현한 것입니다. 대괄호 표기법은 `$['store']['book']`과 같은 명시적 형식입니다. 키가 일반 식별자(공백, 하이픈, 선행 숫자)가 아니거나 많은 도구에서 데이터 이동 색인에 인쇄하는 RFC 9535 정규화된 경로 스타일을 원하는 경우 대괄호를 사용하세요.
- `$.store.bicycle.color` - 일반 키에 적합합니다.
- `$['content-type']` - 키가 JS와 유사한 식별자가 아닌 경우 필요합니다.
- `$['store']['book'][0]['title']` - 한 노드에 대한 단일 정규화된 경로(RFC 9535 §2.7 스타일).
- 인덱스는 항상 대괄호입니다(`$.store.book.0`이 아니라 `$.store.book[0]`).
* 그리고 ..
`*`는 '이 수준의 모든 어린이'를 나타내는 와일드카드입니다. `..`는 재귀적 하강입니다. 트리를 걷고 어떤 깊이에서든 일치하는 항목을 수집합니다. 와일드카드는 얕게 유지됩니다. 하강은 큰 문서에서 당신을 놀라게 할 수 있습니다.
- `$.store.book[*].title` - 모든 책의 제목(배열 항목의 한 수준).
- `$.store.*` - `store` 아래에 `book`과 `bicycle`이 모두 포함됩니다.
- `$..author` - 루트 아래의 모든 `저자`.
- `$..price` - 도서 가격과 자전거 가격을 함께 표시합니다. 하나만 원할 경우 경로를 좁혀보세요.
조각
배열 슬라이스는 괄호 안에 Python과 유사한 `start:end:step`을 사용합니다. 생략된 끝은 "처음부터" 또는 "끝까지"를 의미합니다. 음수 인덱스는 구현에서 지원하는 경우 끝부터 계산됩니다.
- `$.store.book[0:2]` - 처음 두 권의 책(인덱스 0과 1).
- `$.store.book[-1:]` - 음수 인덱스를 허용하는 엔진의 마지막 책입니다.
- `$.store.book[::2]` - 단계가 지원되는 다른 모든 책.
- 선택 배열 항목을 슬라이스합니다. 그 뒤에 필드를 연결합니다: `$.store.book[0:2].title`.
간단한 필터
필터는 `[?(...)]`에 위치하며 표현식이 참인 항목을 유지합니다. `@`는 현재 항목입니다. 비교는 일반적으로 느슨한 JavaScript처럼 유형을 강제하지 않습니다. `1 == "1"`은 종종 false입니다. 필터를 지루하게 유지하세요: 평등, 불평등, 숫자 비교, `&&`, `||`, `!` 및 존재.
- `$.store.book[?(@.price < 10)]` - 저렴한 책.
- `$.store.book[?(@.price < 10 && @.category == 'fiction')].title` - 필터를 적용한 다음 필드를 추출합니다.
- `$.store.book[?(@.isbn)]` - `isbn`이 있는 항목입니다.
- 루트 자체가 배열이 아닌 이상 단독 개체 루트가 아닌 검색 중인 배열에 필터를 적용하세요.
RFC 9535와 이전 Goessner 방언 비교
Stefan Goessner의 2007년 기사는 JSONPath를 대중화했으며 많은 라이브러리가 여전히 그 예제를 복사하고 있습니다. RFC 9535(2024)는 IETF 표준입니다. 더 명확한 문법, 정규화된 경로 및 더 적은 "무엇이든 평가" 이스케이프 해치가 더 적습니다. `[(@.length-1)]`와 같은 스크립트 선택기와 필터 내부의 자유 형식 JavaScript는 안전한 브라우저 테스터가 아닌 오래된 서부 시대에 속합니다.
- RFC 9535 - 표준화된 연산자, `$['store']['book'][0]`과 같은 정규화된 경로, 상호 운용 가능한 구현을 위해 설계되었습니다.
- Goessner 시대의 샘플 - 여전히 블로그 게시물 곳곳에 있습니다. 프로덕션 환경으로 배송하기 전에 확인하세요.
- 평가 없음 하위 집합 - 붙여넣은 API 페이로드에 대해 원하는 것입니다. 스크립트 선택기를 거부합니다. 경로를 JavaScript로 실행하지 마십시오.
- 두 도구가 동의하지 않는 경우 어느 방언이 옳다고 "느끼는" 것이 아니라 그들이 주장하는 방언을 확인하십시오.
전체 사양이 아님
이 글은 매일 입력하는 표현에 대한 치트 시트입니다. 규범적인 세부 사항은 RFC 9535를 읽어보세요. 자신의 JSON에 대한 비공개 시험의 경우 JSONPath 테스터를 사용하세요.
다섯 가지 복사-붙여넣기 예시
서점 샘플에 대해 다음을 순서대로 시도해 보세요.
- `$.store.book[*].title` - 모든 제목을 목록으로 표시합니다.
- `$..author` - 재귀 하강을 통한 모든 저자.
- `$.store.book[0:2]` - 처음 두 개의 책 개체.
- `$.store.book[?(@.price < 10)]` - 가격이 10 미만인 책.
- `$.store.book[?(@.price < 10)].title` - 동일한 필터, 제목만.
단순 레코드 목록을 추출한 후 스프레드시트 보기를 원할 수 있습니다. JSON-CSV 변환기를 통해 객체의 JSON 배열을 파이프합니다. 아직 탐색 중인 중첩된 API Blob의 경우 모양이 명확해질 때까지 JSONPath를 유지하세요.
자주 묻는 질문
모든 JSONPath는 $로 시작하나요?
예, 실제로는 그렇습니다. `$`는 루트의 이름을 지정합니다. 엄격한 도구는 이를 생략하는 경로를 거부합니다.
@는 언제 사용하나요?
`[?()]` 필터 내부에서만 현재 요소로 사용됩니다. 경로 시작 부분의 `$`를 대체할 수 없습니다.
왜 일치 항목이 하나도 없나요?
유효한 경로는 어떤 것과도 일치할 수 없습니다. 일반적인 원인: 배열 대신 객체 루트 필터링, 키의 오타 또는 JavaScript 유형 강제 적용이 예상됩니다. `$..field`를 시도하여 필드가 존재하는지 확인한 다음 조이세요.
JSONPath는 JMESPath 또는 jq와 동일합니까?
아니요. 관련 아이디어, 다른 구문 및 라이브러리. 코드베이스당 하나의 방언을 선택하고 이를 고수하세요.
비공개 API 응답을 안전하게 테스트할 수 있나요?
예, 평가자가 업로드 없이 브라우저에서 실행되는 경우입니다. JSONPath 테스터는 추출된 JSON 또는 정규화된 경로를 붙여넣고 쿼리하고 복사하는 작업을 위해 만들어졌습니다.
ToolsMinify에서 사용해 보세요
아래의 모든 도구는 무료로, 가입이나 업로드가 필요하지 않은 브라우저에서 실행됩니다.
- JSONPath 테스터 - JSON을 붙여넣고, 표현식을 실행하고, 일치 항목 또는 추출된 값을 복사하세요.
- JSON 축소기 및 포맷터 - 쿼리하기 전에 페이로드를 예쁘게 인쇄하거나 축소하세요.
- JSON을 CSV로 변환기 - 추출한 후 객체의 플랫 JSON 배열을 CSV로 변환합니다.
- 모든 개발자 도구 - 전체 카테고리 색인.
무료로 사용해 보세요
JSONPath Tester를 열고 서점 샘플을 로드한 후 `$.store.book[?(@.price < 10)].title`을 붙여넣습니다. 저렴한 타이틀이 모두 귀하의 기기에 표시되어야 합니다.