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

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

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

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



답변

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

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


답변

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

Dojo 문서에서 :

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

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


답변

내가 알고있는 다른 대안은

  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.


답변

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 앱과 통합하려고합니다.

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


답변

JSPath를 사용해보십시오

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

XML 용 XPath와 같은 JSON 용 JSPath

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


답변

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

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


답변

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

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 정규식을 포괄적으로 지원합니다)
  • 튜링 완료입니까? (네)