XQuery / XPath에 해당하는 JSON이 있습니까?


221

다음과 같이 복잡한 JSON 배열 및 해시에서 항목을 검색 할 때

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

항목을 찾는 데 사용할 수있는 쿼리 언어가 in [0].objects where id = 3있습니까?


하나 만들지 않는 한 아닙니다. 쿼리는 서버에 맡기고 REST를 사용하여 필요한 데이터 만 가져 오십시오.
zzzzBov

5
좋은 아이디어 +1 내일이 글을 쓰지 않을 것입니다…

2
XPath는,하지만 난 (같이 읽는 코드를 만드는 JLinq 꽤 좋은 것으로 나타났습니다되지 않음 in(...).where(...).select(...)) : hugoware.net/Projects/jLinq를 .
pimvdb

4
거기에는 많은 라이브러리가 있기 때문에 실망 스럽지만 일반적으로 인정되는 표준에 접근하는 것은 없습니다. 타사에서 사용하는 라이브러리가 있으므로 널리 알려져 있고 사용되는 쿼리 언어를 제공해야합니다.
David Thielen

1
- 물론, 당신이 jsel 사용할 수 있습니다 github.com/dragonworx/jsel - 당신이 변수가 주어진 data당신의 JSON 객체를 포함, 당신은 작성합니다 : jsel(data).select("//*[@id=3]")그것은 3으로 ID 키를 포함하는 객체를 반환
알리

답변:


122

예, JSONPath 라고 합니다 . 소스는 이제 GitHub있습니다 .

DOJO 에도 통합되어 있습니다.


3
Brian의 대답은 dojo의 jsonPath 모듈 대신 jsonQuery 모듈을 사용해야한다고 제안합니다 .
hugomg

5
이것이 얼마나 견고합니까? 그리고 우리에게 거래 킬러 인 Java 또는 C # 버전을 찾을 수 없습니다.
David Thielen

2
여기에 링크 된 사이트는 Javascript 및 PHP를 제공합니다. 당신은 자바 구현을 보려면 여기를 하나있다 : code.google.com/p/json-path
마티아스 Ronge

2
JSONPath는 XPath 형식 의미를 기반으로하지 않는다는 것을 언급해야합니다. JSONiq이 더 나은 옵션 일 수 있습니다.
wcandillon

1
@Paramaeleon 그것은 잘 작동합니다. 그런데 프로젝트가 GitHub마이그레이션 되었습니다 . 사람들이 이것에 대해 계속 언급하고 있기 때문에 Mike는 이것을 대답에 추가하고 싶을 수도 있습니다.
Franklin Yu

21

JSONQuery는 JSONPath의 상위 집합이므로 dojo에서 대체 한다고 생각 합니다 . 그런 다음 RQL도 있습니다.

Dojo 문서에서 :

JSONQuery는 보안, 사용 편의성 및 필터링, 재귀 적 검색, 정렬, 매핑, 범위 선택 및 와일드 카드 문자열 비교 및 ​​다양한 연산자를 사용한 유연한 식을 포함한 포괄적 인 데이터 쿼리 도구를위한 추가 기능을 갖춘 확장 된 JSONPath 버전입니다.

JSONselect 는 질문에 대한 또 다른 관점 (XPath가 아닌 CSS 선택기와 유사)이 있으며 JavaScript 구현이 있습니다.


4
github JSONQuery 링크가 죽은 것 같습니다. JSONSelect에는 이제 JavaScript 버전이 있습니다.
Henrik Aasted Sørensen

19

내가 알고있는 다른 대안은

  1. JSONiq 사양은 두 가지 하위 유형 언어를 지정합니다. 하나는 XML 세부 정보를 숨기고 JS와 유사한 구문을 제공하는 것과 다른 하나는 JSON 생성자와 같은 XQuery 구문을 강화하는 것입니다. Zorba 는 JSONiq을 구현합니다.
  2. MarkLogic 위에 구축 된 Corona 는 XML, JSON, 텍스트 및 이진 콘텐츠를 저장, 관리 및 검색하기위한 REST 인터페이스를 제공합니다.
  3. MarkLogic 6 이상은 즉시 사용 가능한 Corona와 유사한 REST 인터페이스를 제공합니다.
  4. MarkLogic 8 이상은 XQuery 및 서버 측 JavaScript 환경 모두에서 기본적으로 JSON을 지원합니다. XPath를 적용 할 수 있습니다.

HTH.


3
이제 JSONiq 구현이 있습니다. Zorba 2.6이 공식적으로 지원합니다.
Ghislain Fourny

참고 : MarkLogic은 JSON을 버전 8부터 기본적으로 저장하며 XPath를 직접 적용 할 수 있습니다.
grtjn

18

JSON 데이터 탐색 / 필터링에 대한 현재 옵션 중 일부를 요약하고 몇 가지 구문 예제를 제공합니다.

  • JSPath
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json : select () (CSS 선택기에서 더 많은 영감을 얻음)
    .automobiles .maker:val("Honda") .model

  • JSONPath (XPath에서 더 많은 영감을 얻음)
    $.automobiles[?(@.maker='Honda')].model

JSPath가 가장 멋지다고 생각하므로 AngularJS + CakePHP 앱과 통합하려고합니다.

(나는 원래이 답변을 다른 스레드 에 게시 했지만 여기에서도 유용하다고 생각했습니다.)


CSS 선택 기나 XPath에서 영감을 얻었 기 때문에 훌륭한 요약과 예제도 있습니다.
Jochem Schulenklopper

13

JSPath를 사용해보십시오

JSPath는 JSON 문서 내에서 데이터를 탐색하고 찾을 수있는 DSL (Domain-Specific Language)입니다. JSPath를 사용하면 JSON 항목을 선택하여 포함 된 데이터를 검색 할 수 있습니다.

XML 용 XPath와 같은 JSON 용 JSPath

Node.js와 최신 브라우저 모두에 최적화되어 있습니다.


9

프로세서가 JSON 지원을 제공하는 경우 XQuery를 사용하여 JSON을 쿼리 할 수 ​​있습니다. BaseX를 사용하여 "id"= 1 인 객체를 찾는 간단한 방법입니다.

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

(6 년 이상) Saxon은 JSON을 쿼리하는 XQuery 3.1을 실행합니다. 내 Saxon 경험은 java가 실행하는 jar 파일을 사용하고 있습니다. saxon-java라는 노드 모듈이 있지만 어떻게 작동하는지 잘 모르겠습니다. 그리고 Saxonica에서 Saxon-JS라는 또 다른 새로운 것이 있습니다.
찰스 로스

9

어떤 종류의 쿼리 언어가 있습니까?

JQ는 정의 J 아들 의 Q JSONPath 매우 유사하다 uery 언어 - 참조 https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [[]] id = 3 인 [0] .objects에서 항목을 찾을 수 있습니까?

나는 이것이 의미한다고 가정합니다 : 객체의 위치에 관계없이 id == 3 인 지정된 키 아래의 모든 JSON 객체를 찾으십시오. 해당 jq 쿼리는 다음과 같습니다.

.[0].objects | .. | objects | select(.id==3)

어디에 "|" 파이프 연산자 (명령 쉘 파이프에서와 같이)이며 세그먼트 ".. | objects"는 "개체의 위치에 관계없이"에 해당합니다.

jq의 기본 사항은 대체로 명백하거나 직관적이거나 최소한 매우 간단하며, 명령 쉘 파이프에 익숙하다면 나머지 대부분은 쉽게 찾을 수 있습니다. jq FAQ 에는 튜토리얼 등에 대한 포인터가 있습니다.

jq 프로세서는 CRUD 연산을 지원한다는 점에서도 SQL과 비슷하지만 jq 프로세서는 입력을 덮어 쓰지 않습니다. jq는 또한 JSON 엔티티의 스트림을 처리 할 수 ​​있습니다.

JSON 지향 쿼리 언어를 평가할 때 고려해야 할 다른 두 가지 기준은 다음과 같습니다.

  • 정규식을 지원합니까? (jq 1.5는 PCRE 정규식을 포괄적으로 지원합니다)
  • 튜링 완료입니까? (네)

8

Defiant.js 도 꽤 멋져 보입니다. 간단한 예는 다음과 같습니다.

var obj = {
        "car": [
            {"id": 10, "color": "silver", "name": "Volvo"},
            {"id": 11, "color": "red",    "name": "Saab"},
            {"id": 12, "color": "red",    "name": "Peugeot"},
            {"id": 13, "color": "yellow", "name": "Porsche"}
        ],
        "bike": [
            {"id": 20, "color": "black", "name": "Cannondale"},
            {"id": 21, "color": "red",   "name": "Shimano"}
        ]
    },
    search = JSON.search(obj, '//car[color="yellow"]/name');

console.log( search );
// ["Porsche"]

var reds = JSON.search(obj, '//*[color="red"]');

for (var i=0; i<reds.length; i++) {
    console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano

불행히도, 현재 npm에 게시되지 않았으며 수동 설치가 필요합니다.
Andrew Mao


7

Jsel훌륭하고 실제 XPath 엔진을 기반으로합니다. XPath 표현식을 만들어 객체뿐만 아니라 문자열도 모든 유형의 JavaScript 데이터를 찾을 수 있습니다.

사용자 정의 스키마 및 맵핑을 작성하여 XPath 엔진이 데이터를 이동하는 방법을 완전히 제어 할 수 있습니다. 스키마는 데이터에서 요소, 자식, 특성 및 노드 값이 정의되는 방식을 정의하는 방법입니다. 그런 다음 자신에게 맞는 식을 만들 수 있습니다.

data질문에서 JSON을 포함 하는 변수가 있다고 가정하면 jsel을 사용하여 작성할 수 있습니다.

jsel(data).select("//*[@id=3]")

id속성이 3 인 모든 노드를 반환합니다 . 속성은 객체 내의 기본 (문자열, 숫자, 날짜, 정규식) 값입니다.


6

ObjectPath 는 XPath 또는 JSONPath와 유사한 쿼리 언어이지만 내장 된 산술 계산, 비교 메커니즘 및 내장 함수 덕분에 훨씬 강력합니다. 구문을 참조하십시오.

상점에서 붉은 색 신발과 50 미만의 가격을 찾으십시오.

$ .. shoes. * [색은 "빨간색"이고 가격은 <50입니다.]


나는 웹 사이트의 첫 번째 예제를 좋아하고 ObjectPath가 상호 작용 방식의 쉘과 같은 모드로 실행될 수 있다는 점이 훌륭하지만 필자가 찾고있는 것은 Python 스크립트에서 ObjectPath를 사용하는 것입니다. ObjectPath를 라이브러리로 사용하는 방법을 보여주는 예를 알려 주시겠습니까? 웹 사이트에서 그런 것을 찾을 수 없습니다.
piokuc

github의 Python 사용법 섹션을 참조하십시오 . 우리는 이것을 웹 사이트에 추가 할 것입니다-실제로는 찾기가 어렵습니다. 추가 도움이 필요한 경우 Google 그룹에 질문을 게시 할 수 있습니다 .
엘라 베드 나렉

감사합니다, Ela, github 페이지에 추가 된 예제는 정확히 필요한 것입니다.
piokuc

4

@Naftule- "defiant.js"를 사용하면 XPath 표현식을 사용하여 JSON 구조를 쿼리 할 수 ​​있습니다. 작동 방법에 대한 아이디어를 얻으려면이 평가자를 확인하십시오.

http://www.defiantjs.com/#xpath_evaluator

JSONPath와 달리 "defiant.js"는 JSON 구조에서 XPath의 쿼리 구문을 완벽하게 지원합니다.

defiant.js의 소스 코드는 여기에서 찾을 수 있습니다 :
https://github.com/hbi99/defiant.js


3

JMESPath 는 요즘 (2020 년 현재) 매우 인기가있는 것으로 보이며 JSONPath 와 관련된 많은 문제를 해결합니다. 많은 언어에서 사용할 수 있습니다.


1

당신이 나와 같고 경로 기반 조회를하고 싶지만 실제 XPath에 관심이 없다면 lodash _.get()가 작동 할 수 있습니다. lodash 문서의 예 :

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'

불행히도 그 함수는 단일 결과 만 반환 할 수 있으며, 다른 라이브러리가 빛나는 곳에서 일치하는 항목의 배열을 가져 오는 것은 지원하지 않습니다.
Simon East

0

이것을 사용해보십시오-https: //github.com/satyapaul/jpath/blob/master/JSONDataReader.java

xml에 대한 비슷한 xpath 라인에서 매우 간단한 구현입니다. jpath라는 이름입니다.


1
이 질문은 자바 스크립트 로 태그되어 있지만이 라이브러리는 java
tripleee

그것은 자바 스크립트 버전도 있습니다 -github.com/satyapaul/jpath/blob/master/jpath.js 여기 프로젝트에 대한 자식 홈 페이지가 있습니다 -github.com/satyapaul/jpath
Satyajit Paul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.