
http://goessner.net/articles/JsonPath/ 에서 가져온 JSONPath의 포크
(개발 종속성 라이선스는 여기를 참조하세요)
JSON 문서(및 JavaScript 객체)에서 데이터를 분석, 변환, 선택적으로 추출합니다.
jsonpath-plus는 원래 사양을 확장하여 일부 추가 연산자를 제공하고,
원래 사양에서 명시하지 않은 일부 동작을 명확히 합니다.
브라우저 데모 또는 Runkit (Node)를 사용해 보세요.
참고: 이 프로젝트는 현재 적극적으로 유지관리되고 있지 않습니다. 잘 문서화된 PR이나 간단한 업데이트는 수락할 수 있지만, 저희가 직접 수정하거나 새로운 기능을 추가할 계획은 없습니다.
^~@null(), @boolean(), @number(), @string(), @array(), @object()@integer()@scalar() (undefined 및 JavaScript 객체를 쿼리할 때
비유한 숫자도 허용하며, 모든 기본 비객체/비함수 타입도 포함)otherTypeCallback과 함께 사용할 수 있는 @other()jsonpath-plus는 json-querying-performance-testing에 따르면 다른 JSON 쿼리 라이브러리와 비교하여 크고 작은 데이터셋 모두에서 지속적으로 우수한 성능을 보입니다. 프로젝트를 직접 실행하고 더 많은 성능 테스트 케이스를 추가하여 이러한 결과를 확인할 수 있습니다.
npm install jsonpath-plus
## 설정
### Node.js```js
const {JSONPath} = require('jsonpath-plus');
const result = JSONPath({path: '...', json});
브라우저에서 사용하려면 dist/index-browser-umd.cjs를 직접 포함할 수 있으며,
Browserify 마법은 필요하지 않습니다:```html
### ESM (최신 브라우저)
최신 브라우저의 경우 ES6 Module imports를 사용할 수도 있습니다:```html
<script type="module">
import {
JSONPath
} from './node_modules/jsonpath-plus/dist/index-browser-esm.js';
const result = JSONPath({path: '...', json: {}});
</script>
또는 JavaScript를 번들링하는 경우(예: Rollup) 그냥 사용하세요,
참고로 mainFields에는
브라우저 빌드의 경우 browser가 포함되어야 하며(Node의 기본값은
module을 확인하므로 괜찮습니다):```js
import {JSONPath} from 'jsonpath-plus';
const result = JSONPath({path: '...', json});
## 사용법
사용 가능한 전체 시그니처는 다음과 같습니다:```
const result = JSONPath([options,] path, json, callback, otherTypeCallback);
인자 path, json, callback, otherTypeCallback은
(다른 사용 가능한 속성들과 함께) 대안적으로 표현될 수
있습니다 (options에서).
참고로 result는 발견된 모든 항목을 포함하며 (선택적으로
배열로 감싸짐), 반면 callback은 각 항목이 발견될 때마다
어떤 작업을 수행하려는 경우 사용할 수 있고, 콜백 함수는
결과에서 발견될 독립 항목 수에 따라 0회에서 N회까지
실행됩니다.
JSONPath의 사용 가능한 인자에 대한 자세한 내용은 아래 문서를 참조하십시오.
또한 API 문서를 참조하십시오.
options 객체 또는 evaluate 메서드(첫 번째 인자로)에 제공할 수 있는 속성은 다음과 같습니다:
false로 제공되면,
evaluate 메서드를 수동으로 호출할 수 있습니다.wrap이 false로 설정되고 결과가 없으면,
undefined가 반환됩니다 (wrap이 true로 설정된 경우의 빈 배열과는 대조적).
wrap이 false로 설정되고 단일
비배열 결과가 발견되면 해당 결과만(배열 안에 담기지 않고) 반환됩니다.
그러나 여러 결과가 발견되면 여전히 배열이 반환됩니다.
모호성을 피하기 위해 (결과가 실패인지
빈 배열인지를 구분해야 하는 경우)
기본값을
로 전환하는 것이 좋습니다.autostart 속성이 false로 설정된 경우에만 필요합니다. 이 메서드는
동일한 구성으로 평가를 반복할 때 사용할 수 있습니다.
나열된 속성 외에도 후자의 메서드 패턴은
허용되는 다른 모든 인스턴스 속성을 받을 수 있습니다 (단,
여기서는 관련이 없는 autostart는 제외).['$', 'aProperty', 'anotherProperty']처럼 변환합니다.$['aProperty']['anotherProperty][0]와 같은 형태가 됩니다. JSONPath 터미널
구성인 ~와 ^, 그리고 @string()과 같은 타입 연산자는
자동으로 제거됩니다./aProperty/anotherProperty/0과 같은 형태가 됩니다.
(~와 / 내부 문자는 JSON
Pointer 명세에 따라 이스케이프됩니다). JSONPath 터미널 구성인 ~와 ^, 그리고
@string()과 같은 타입 연산자는 자동으로 제거됩니다.다음 JSON은 http://goessner.net/articles/JsonPath/에서 가져온 것입니다:```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 } } }
및 다음 XML 표현:```xml
<store>
<book>
<category>reference</category>
<author>Nigel Rees</author>
<title>Sayings of the Century</title>
<price>8.95</price>
</book>
<book>
<category>fiction</category>
<author>Evelyn Waugh</author>
<title>Sword of Honour</title>
<price>12.99</price>
</book>
<book>
<category>fiction</category>
<author>Herman Melville</author>
<title>Moby Dick</title>
<isbn>0-553-21311-3</isbn>
<price>8.99</price>
</book>
<book>
<category>fiction</category>
<author>J. R. R. Tolkien</author>
<title>The Lord of the Rings</title>
<isbn>0-395-19395-8</isbn>
<price>22.99</price>
</book>
<bicycle>
<color>red</color>
<price>19.95</price>
</bicycle>
</store>
유의하세요: 아래 XPath 예제는 요소 검색과 해당 텍스트 콘텐츠 검색을
구분하지 않습니다(비교에 유용하거나 모호함을 방지하는 경우는 제외).
참고: XPath 예제(2.0 포함)를 테스트하려면,
이 데모가
유용할 수 있습니다(xml 또는 xml-strict로 설정).| XPath | JSONPath | Result | Notes |
|-------------------------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /store/book/author | $.store.book[*].author | 가게에 있는 모든 책의 저자 | 없이 로도 표현할 수 있습니다(원래 사양에는 없지만). 다만 일부 문자 리터럴( 및 )은 이스케이프가 필요합니다. |
| | | 모든 저자 | |
| | | 가게 안의 모든 것, 즉 책들(책 배열)과 빨간 자전거(자전거 객체). | |
| | | 가게에 있는 모든 것의 가격. | |
| | | 세 번째 책(책 객체) | |
| | | 순서상 마지막 책. | 특수 문자가 포함된 속성에 접근하려면 필터에 를 사용하세요(이 특정 기능은 원래 사양에 없습니다). |
| | | 처음 두 권의 책 | |
| or in XPath 2.0 | | 모든 책의 카테고리와 저자 | |
| | | ISBN 번호가 있는 모든 책 필터링 | 특수 문자가 포함된 속성에 접근하려면 필터에 를 사용하세요(이 특정 기능은 원래 사양에 없습니다). |
| | | 10보다 저렴한 모든 책 필터링 | |
| | | 속성이 price이고 8.95와 같지 않은 객체들의 모든 속성 값 가져오기 | 단독 를 사용하면 (반드시 배열 내부가 아니어도) 속성 값으로 객체를 필터링할 수 있습니다. 표현식 뒤에 를 추가하면 필터링된 속성을 보유한 객체에 접근할 수 있습니다. |
| | | JSON 객체의 루트(즉, 객체 전체 자체) | 리터럴 (단독 또는 경로의 어느 위치에서든)를 얻으려면 백틱 이스케이프를 사용해야 합니다. |
| | | XML 문서에서 루트 아래의 모든 요소(및 텍스트). 루트 아래의 JSON 구조의 모든 멤버. | |
| | | XML 문서의 모든 요소. 루트를 포함한 JSON 구조의 모든 부모 구성 요소. | 이 동작은 원래 사양에 직접 명시되지 않았습니다. |
| | | 가격이 19보다 큰 해당 항목들의 부모(즉, 자전거의 부모인 store 값과 개별 책의 부모인 책 배열) | 부모(캐럿)는 원래 사양에 없습니다. |
| (in XPath 2.0) | | store 하위 객체의 속성 이름("book" 및 "bicycle"). 와일드카드 속성과 함께 유용합니다. | 속성 이름(틸드)은 원래 사양에 없습니다. |
| (in XPath 2.0) | | 첫 번째 책을 가리키는 경로에 있는 책 외의 모든 책 | 는 원래 사양에 없습니다. |
| | | 책의 부모 객체에 색상이 빨간색인 bicycle 자식이 있는 모든 책의 카테고리를 가져옵니다(즉, 모든 책). | 는 원래 사양에 없습니다. |
| | | "book"의 자식 중 "category" 자식을 제외한 모든 자식을 가져옵니다. | 는 원래 사양에 없습니다. |
| | | 속성(배열 내부에 접근 중이므로 숫자 인덱스임)이 0이 아닌 모든 책을 가져옵니다. | 는 원래 사양에 없습니다. |
| | | 부모 속성이 book이 아닌 store의 손주들을 가져옵니다(즉, bicycle의 자식인 "color"와 "price"). | 는 원래 사양에 없습니다. |
| | | 이 값들의 부모 속성(즉, 책 항목의 부모 객체를 보유한 배열 인덱스)이 0이 아닌 모든 책 인스턴스의 속성 값을 가져옵니다. | 는 원래 사양에 없습니다. |
| | | 가격이 세 번째 책의 가격과 같은 모든 책 필터링 | 는 원래 사양에 없습니다. |
| (in XPath 2.0) | | 책 배열 내의 숫자 값 가져오기 | , 기타 기본 유형(, ), 기타 저수준 파생 유형(, , ), JSONSchema에서 추가된 유형 , 복합 유형 (JavaScript 객체의 및 비유한 숫자뿐만 아니라 모든 기본 비객체/비함수 유형도 허용), 사용자 정의 콜백과 함께 사용되는 유형( 참조), 그리고 JSON이 아닌 JavaScript 객체를 쿼리할 때 JSONPath와 함께 사용할 수 있는 다음 비JSON 유형들(, , )은 원래 사양에 없습니다. |
| (XPath 2.0) | | 정규식과 일치하는(대소문자 구분 없이 'TION'으로 끝나는) 모든 책 카테고리 | 는 원래 사양에 없습니다. |
| (XPath 2.0) | | 정규식과 일치하는(대소문자 구분 없이 'TION'으로 끝나는) 속성을 가진 모든 책 | 는 원래 사양에 없습니다. 참고: 표현식 끝에 부모 선택자 를 사용하여 부모 객체로 돌아갑니다. 부모 선택자가 없으면 두 개의 키 값을 일치시킵니다. |
| | (e.g., to match a property literally named ) | 뒤에 오는 전체 시퀀스를 이스케이프합니다(리터럴로 처리됨) | 는 원래 사양에 없습니다. 리터럴 백틱을 얻으려면 추가 백틱을 사용하여 이스케이프하세요. |선택적 "sandbox" 객체 옵션의 속성으로 제공되는 추가 변수들은
(괄호 기반) 평가에서도 사용할 수
있습니다.
@가 자식에 대한 참조인 것 외에도
실제로 직접 자식도 선택하는 반면,
XPath에서 필터 조건은 자식을 선택하지 않고
결과에서 해당 부모 노드 중 어떤 것이 얻어질지를 한정합니다.기본적인 명령줄 인터페이스(CLI)가 제공됩니다. npx jsonpath-plus <json-file> <jsonpath-query>를 사용하여 접근할 수 있습니다.
|와 같은) 및 그룹화 지원.Node에서 테스트 실행:```shell npm test
브라우저 내 테스트의 경우:
- js/html 파일을 제공하십시오:```shell
npm run browser-test
중요한 보안 고려 사항 및 취약점 신고 방법은 SECURITY.md를 참조하세요.
@undefined(), @function(), @nonFinite())@path/@parent/@property/@parentProperty/@root 축약 선택자`@['...']/?@['...'] 구문$.. 문서 (모든 부모 구성 요소 가져오기)falsesafe: 브라우저에서는 eval이나 Function을 사용하지 않는
최소 스크립팅 엔진을 사용하며 CSP(Content Security Policy)를 충족합니다. NodeJS에서는
스크립팅이 안전하므로 아무 효과가 없으며 native와 동일합니다.
native: 네이티브 스크립팅 기능을 사용합니다. 즉, 브라우저에서는 안전하지 않은 eval 또는
Function을, nodejs에서는 vm.Script를 사용합니다. false: JavaScript 평가 표현식을 비활성화하고
이러한 표현식이 시도되면 예외를 throw합니다.
callback [ (code, context) => value]: code와 context를 인자로 호출되어
평가된 값을 반환하는 사용자 정의 구현입니다.
class: 생성자 인자로 code를 사용하여 생성되는 클래스이며, 코드는
context로 runInNewContext를 호출하여 평가됩니다.
``parentProperty가
결과 내에서 반환될 수 있습니다. 이는 문자열 속성 이름이거나
숫자 배열 인덱스일 수 있습니다.resultType에 따름),
페이로드의 유형 (일반 "value"인지 "property" 이름인지),
그리고 전체 페이로드 객체 (모든 resultType 포함)입니다.@other() 연산자를 추가하면 됩니다. 만약 그러한
경로가 발견되면 otherTypeCallback이 해당 항목의 값,
경로, 부모, 부모의 속성 이름과 함께 호출되며,
제공된 값이 "other" 타입에 속하는지 여부를 나타내는 불리언을
반환해야 합니다(또는 변환을 처리하고
false를 반환할 수도 있습니다).$.store.book[*].author$@//author$..author/store/*$.store.*/store//price$.store..price//book[3]$..book[2]//book[last()]$..book[(@.length-1)]$..book[-1:][(@['...'])]//book[position()<3]$..book[0,1]$..book[:2]//book/*[self::category\|self::author]//book/(category,author)$..book[0][category,author]//book[isbn]$..book[?(@.isbn)][?@['...']]//book[price<10]$..book[?(@.price<10)]//*[name() = 'price' and . != 8.95]$..*[?(@property === 'price' && @ !== 8.95)]@^/$$//*/*\|//*/*/text()$..*//*$..//*[price>19]/..$..[?(@.price>19)]^/store/*/name()$.store.*~/store/book[not(. is /store/book[1])]$.store.book[?(@path !== "$['store']['book'][0]")]@path//book[parent::*/bicycle/color = "red"]/category$..book[?(@parent.bicycle && @parent.bicycle.color === "red")].category@parent//book/*[name() != 'category']$..book.*[?(@property !== "category")]@property//book[position() != 1]$..book[?(@property !== 0)]@property/store/*/*[name(parent::*) != 'book']$.store.*[?(@parentProperty !== "book")]@parentProperty//book[count(preceding-sibling::*) != 0]/*/text()$..book.*[?(@parentProperty !== 0)]@parentProperty//book[price = /store/book[3]/price]$..book[?(@.price === @root.store.book[2].price)]@root//book/../*[. instance of element(*, xs:decimal)]$..book..*@number()@number()@boolean()@string()@null()@object()@array()@integer()@scalar()undefined@other()otherTypeCallback@undefined()@function()@nonFinite()//book/*[name() = 'category' and matches(., 'tion$')]$..book.*[?(@property === "category" && @.match(/TION$/i))]@property//book/*[matches(name(), 'bn$')]/parent::*$..book.*[?(@property.match(/bn$/i))]^@property^isbn` `$$`