IT story

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

hot-time 2020. 4. 28. 08:25
반응형

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에서 항목을 찾을 수 있습니까?

I'll assume this means: find all JSON objects under the specified key with id == 3, no matter where the object may be. A corresponding jq query would be:

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

where "|" is the pipe-operator (as in command shell pipes), and where the segment ".. | objects" corresponds to "no matter where the object may be".

The basics of jq are largely obvious or intuitive or at least quite simple, and most of the rest is easy to pick up if you're at all familiar with command-shell pipes. The jq FAQ has pointers to tutorials and the like.

jq is also like SQL in that it supports CRUD operations, though the jq processor never overwrites its input. jq can also handle streams of JSON entities.

Two other criteria you might wish to consider in assessing a JSON-oriented query language are:

  • does it support regular expressions? (jq 1.5 has comprehensive support for PCRE regex)
  • is it Turing-complete? (yep)

Json Pointer seem's to be getting growing support too.


Defiant.js looks also pretty cool, here's a simple example:

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

Jsel is awesome and is based on a real XPath engine. It allows you to create XPath expressions to find any type of JavaScript data, not just objects (strings too).

You can create custom schemas and mappings to give you complete control over how your data is walkable by the XPath engine. A schema is a way of defining how elements, children, attributes, and node values are defined in your data. Then you can create your own expressions to suit.

Given you had a variable called data which contained the JSON from the question, you could use jsel to write:

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

This will return any node with an id attribute of 3. An attribute is any primitive (string, number, date, regex) value within an object.


ObjectPath is a query language similar to XPath or JSONPath, but much more powerful thanks to embedded arithmetic calculations, comparison mechanisms and built-in functions. See the syntax:

Find in the shop all shoes of red color and price less than 50

$..shoes.*[color is "red" and price < 50]


@Naftule - with "defiant.js", it is possible to query a JSON structure with XPath expressions. Check out this evaluator to get an idea of how it works:

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

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

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


당신이 나와 같고 경로 기반 조회를하고 싶지만 실제 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'

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

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

참고 URL : https://stackoverflow.com/questions/8481380/is-there-a-json-equivalent-of-xquery-xpath

반응형