JSON에 대한 쿼리 언어가 있습니까?
JSON을 쿼리하기 위한 (대략) SQL 또는 XQuery와 유사한 언어가 있습니까?
"Y > 3인 X의 모든 값은 무엇입니까?"와 같은 질문에 쉽게 대답하거나 일반적인 SUM/COUNT 유형의 작업을 수행하는 것이 좋은 JSON에 적합한 매우 작은 데이터 세트를 생각하고 있습니다.
완전히 꾸며낸 예로서 다음과 같은 것이 있습니다.
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0 (would equate to 7)
LIST(X) WHERE Y > 0 (would equate to [3,4])
클라이언트 측과 서버 측 모두에서 효과가 있을 것으로 생각되며, 결과는 적절한 언어별 데이터 구조(또는 JSON으로 유지)로 변환됩니다.
빠른 구글링을 통해 사람들이 그것에 대해 생각하고 몇 가지 사항(JAQL)을 구현했음을 알 수 있지만, 아직 표준 사용법이나 라이브러리 세트가 등장하지는 않은 것 같습니다.각 기능은 그 자체로는 구현이 매우 간단하지만, 누군가가 이미 올바르게 구현했다면 저는 바퀴를 다시 발명하고 싶지 않습니다.
좋은 의견이라도 있나?
편집: 이것은 확실히 잘못된 생각일 수도 있고, JSON이 제 생각에 너무 일반적인 형식일 수도 있습니다.필요에 따라 직접 summing/etc 기능을 하는 것이 아니라 쿼리 언어를 원하는 이유는 사용자 입력에 따라 동적으로 쿼리를 구축하고 싶기 때문입니다."SQL은 필요 없고 필요한 기능만 쓰면 된다"는 주장과 비슷합니다.결국 이 문제는 걷잡을 수 없게 되거나 계속 진행하면서 자신만의 SQL 버전을 작성하게 됩니다.(알겠습니다.그게 좀 바보 같은 주장인 건 알지만, 그 아이디어는 이해하실 수 있습니다.)
2022년 9월 편집:
JMESPath는 가장 널리 사용되고 있으며, 가장 빠르게 성장하고 있으며, 이에 대한 대안으로 가장 잘 검토되고 있는 것으로 보인다.「어디」스타일의 필터를 포함한 많은 기능을 갖추고 있습니다.
오리지널:
네, 그럼 어떻게 하죠?
모두 조금씩 진행 중인 것처럼 보이지만 어느 정도는 효과가 있습니다.XML과 JSON의 개념 모델(계층형 대 객체/구조)은 다르지만 개념적으로는 XPath 및 XQuery와 유사합니다.
2015년 9월 편집:
실제로 JSON 콘텐츠의 매우 단순하고 효율적인 통과를 가능하게 하는 JSON 포인터 표준이 있습니다.이것은 정식으로 지정되어 있을 뿐만 아니라 많은 JSON 라이브러리에서 지원됩니다.그래서 저는 이것을 실제 유용한 표준이라고 부르고 싶습니다만, 표현력이 한정되어 있기 때문에 쿼리 언어 그 자체로 간주될 수도 있고 그렇지 않을 수도 있습니다.
지금 하고 있는 jLinq라는 프로젝트를 추천합니다.의견을 듣고 싶기 때문에 의견을 듣고 싶습니다.
에서 LINQ와 유사한 쿼리를 쓸 수 있는 경우...
var results = jLinq.from(records.users)
//you can join records
.join(records.locations, "location", "locationId", "id")
//write queries on the data
.startsWith("firstname", "j")
.or("k") //automatically remembers field and command names
//even query joined items
.equals("location.state", "TX")
//and even do custom selections
.select(function(rec) {
return {
fullname : rec.firstname + " " + rec.lastname,
city : rec.location.city,
ageInTenYears : (rec.age + 10)
};
});
완전 확장 가능!
문서는 아직 진행 중이지만 온라인으로 시도할 수 있습니다.
업데이트: XQuery 3.1은 XML 또는 JSON 중 하나 또는 둘 모두를 쿼리할 수 있습니다.XPath 3.1도 가능합니다.
리스트는 증가하고 있습니다.
- JSONiq(XQuery 기반)
- UNQL(SQL과 유사)
- JaQL(기능)
- Json Path(XPath 유사)
- Json Query (XPath와 같은 종류)
- GraphQL(템플릿 기반, 유형)
JMESPath는 매우 쉽고 잘 작동합니다.http://jmespath.org/상세한 사양과 다국어 대응 라이브러리를 갖추고 있습니다.아마존이 AWS 명령줄 인터페이스에서 사용하고 있기 때문에 상당히 안정적이어야 합니다.
구문 예시:
// Select a single item
people[1].firstName
// Select a slice of an array
people[0:5]
// Select all the first names
people[*].firstName
// Select all first names based on search term
people[?state=='VA'].firstName
// Count how many people are over 35
length(people[?age>`35`])
// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}
// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)
문서에는 더 많은 실제 예가 있습니다.
jq는 JSON 쿼리 언어이며 주로 명령줄에 사용되지만 광범위한 프로그래밍 언어(Java, node.js, php, ...)에 바인딩되어 있으며 jq-web을 통해 브라우저에서 사용할 수 있습니다.Jq의 C 기반 구현은 일반적으로 "jq"로 알려져 있으며 Go 기반 버전은 "gojq"로 알려져 있습니다.
이 JSON을 예로 든 첫 번째 질문에 근거한 몇 가지 그림을 다음에 나타냅니다.
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) 여기서 Y > 0 (7과 같음)
map(select(.y > 0)) | add
리스트(X) 여기서 Y > 0 ([3,4]에 해당)
map(.y > 0)
jq 구문은 JSON 구문을 확장합니다.
JSON 이며, JSON 은 jq 표현이다.[1, (1+1)] (구문을 을 보여줍니다.
보다 유용한 예는 jq 식입니다.
{a,b}
값 JSON을 {"a":1, "b":2, "c": 3} 「 」, 「 」로됩니다.{"a":1, "b":2}.
내장된 메서드는 이러한 javascript 쿼리 라이브러리의 대부분을 쓸모없게 만듭니다.
간단한 비교, startsWith 등 딜러 내부에 가능한 한 많은 조건을 넣을 수 있습니다.테스트하지 않았지만 내부 컬렉션에 대한 쿼리를 위해 필터를 중첩할 수도 있습니다.
이것을 보는 또 다른 방법은 mongoDB를 사용하는 것입니다.JSON을 mongo에 저장한 후 mongodb 쿼리 구문을 통해 조회할 수 있습니다.
를 사용하고 있는 경우.NET 다음에 Json.NET은 JSON 상단의 LINQ 쿼리를 지원합니다.이 게시물에는 몇 가지 예가 있습니다.필터링, 매핑, 그룹화 등을 지원합니다.
ObjectPath는 복잡하거나 알 수 없는 구조의 JSON 문서를 위한 단순하고 적합한 쿼리 언어입니다.XPath 또는 JSONPath와 비슷하지만 내장된 산술 계산, 비교 메커니즘 및 내장 함수를 통해 훨씬 강력합니다.

Python 버전은 성숙하여 생산에 사용되고 있습니다.JS는 아직 베타 버전입니다.
조만간 본격적인 Javascript 버전을 제공할 예정입니다.또한 Mongo 쿼리에 대한 간단한 대안이 될 수 있도록 더욱 발전시키고 싶습니다.
네, 이 게시물은 좀 오래되었지만...JS 객체의 네이티브 JSON(또는 JS 객체)에서 SQL과 같은 쿼리를 수행하려면 https://github.com/deitch/searchjs을 참조하십시오.
JSON으로 작성된 jsql 언어이자 참조 구현입니다.name==="John" & age===25를 가진 배열 내의 모든 개체를 찾고 싶습니다.
{name:"John",age:25,_join:"AND"}
참조 실장 검색js는 브라우저 및 노드 npm 패키지로 동작합니다.
npm install searchjs
또한 복잡한 결합 및 부정(NOT) 등의 작업을 수행할 수 있습니다.기본적으로 대소문자를 무시합니다.
아직 합산이나 셈은 하지 않지만 밖에서 하는 것이 더 쉬울 것이다.
순수 Javascript를 사용하려면 다음을 수행하십시오.
var object = { result: { data: { point1: "x", value: 2 }, foo: { bar: 7 } } },
path = 'result.data.value',
getValue = (o, p) => p.split('.').reduce((r, k) => r[k], o);
console.log(getValue(object, path));
여기에도 도움이 되는 간단한 Javascript 라이브러리가 몇 가지 있습니다.
- Dollar Q는 멋진 경량 도서관입니다.jQuery에 의해 널리 사용되는 체인 구문에 익숙한 느낌이며 373 SLOC에 불과합니다.
- SpahQL은 XPath(홈페이지, Github)와 유사한 구문을 가진 풀기능 쿼리 언어입니다.
jFunk는 CSS/jQuery 실렉터와 유사한 구문을 가진 진행 중인 쿼리 언어입니다.그것은 유망해 보였지만, 초기 약속 이상으로 발전한 것은 없다.
(2014년 추가): jq 명령줄 툴은 구문이 깔끔하지만 안타깝게도 c 라이브러리입니다.사용 예:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
MongoDB에서는 이렇게 동작합니다(Mongo 쉘에는 사용자가 선택한 언어의 드라이버가 있습니다).
db.collection.insert({"x": 2, "y": 0}); // notice the ':' instead of ','
db.collection.insert({"x": 3, "y": 1});
db.collection.insert({"x": 4, "y": 1});
db.collection.aggregate([{$match: {"y": {$gt: 0}}},
{$group: {_id: "sum", sum: {$sum: "$x"}}}]);
db.collection.aggregate([{$match: {"y": {$gt: 0}}},
{$group: {_id: "list", list: {$push: "$x"}}}]);
(그냥 하세요)mongod합니다.mongo★★★★★★★★★★★★★★★★★★)
다음 두 가지는 데이터를 처리합니다.$match 필터, 적용sum ★★★★★★★★★★★★★★★★★」list각각 다음과 같다.
https://github.com/niclasko/Cypher.js 를 참조해 주세요(주의:제가 작가입니다.)
이것은 그래프 데이터베이스와 함께 Cyper 그래프 데이터베이스 쿼리 언어의 의존성이 0인 Javascript 구현입니다.브라우저에서 실행됩니다(Firefox, Chrome, IE에서 테스트됨).
질문에 대한 관련성과 함께.JSON 엔드포인트를 쿼리하는 데 사용할 수 있습니다.
load json from "http://url/endpoint" as l return l limit 10
다음은 복잡한 JSON 문서를 쿼리하고 분석을 수행하는 예입니다.
를 사용할 수 있습니다.
이를 통해 다른 구조 데이터와 마찬가지로 개체의 데이터 집합에서 집계 및 선택을 사용할 수 있습니다.
var data = [{ x: 2, y: 0 }, { x: 3, y: 1 }, { x: 4, y: 1 }];
// SUM(X) WHERE Y > 0 -> 7
console.log(Enumerable.From(data).Where("$.y > 0").Sum("$.x"));
// LIST(X) WHERE Y > 0 -> [3, 4]
console.log(Enumerable.From(data).Where("$.y > 0").Select("$.x").ToArray());
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>
SpahQL은 이 중에서 가장 유망하고 잘 생각되는 분야입니다.꼭 확인해 보시길 권해드립니다.
원하는 기능을 제공하는 클라이언트 사이드 JS-lib(defant.js)의 릴리스 가능 버전을 방금 마쳤습니다. 표현 ).defiant.js는 XPath 표현으로 구조를 조회할 수 있습니다.
동작의 예(http://defiantjs.com/defiant.js/demo/sum.avg.htm)의 브라우저에서 참조).
var data = [
{ "x": 2, "y": 0 },
{ "x": 3, "y": 1 },
{ "x": 4, "y": 1 },
{ "x": 2, "y": 1 }
],
res = JSON.search( data, '//*[ y > 0 ]' );
console.log( res.sum('x') );
// 9
console.log( res.avg('x') );
// 3
console.log( res.min('x') );
// 2
console.log( res.max('x') );
// 4
하다, 반항하다JS는 검색 기능으로 글로벌 오브젝트 JSON을 확장하고 반환된 어레이를 집약 함수로 전달한다.JS에는 몇 가지 다른 기능이 포함되어 있지만, 이러한 기능은 이 과목의 범위를 벗어납니다.XPath Evaluator의 lib.XPath에 익숙하지 않은 사람들은 이 평가기가 유용하다고 생각할 것입니다.
http.com/ #://defiantjs.com/ #xpath_modulator
jsdefiant.js 상세
http://defiantjs.com/http.com/
https://github.com/hbi99/defiant.jshttpsgithub.com/hbi99/.js
도움이 됐으면 좋겠는데...안부 전해요
구글에는 러브필드라는 프로젝트가 있습니다.그것을 알게 된 지 얼마 안 되어 흥미로워 보입니다.단, 언더스코어나 로더쉬를 삽입하는 것 말고도 더 많은 것이 관련되어 있습니다.
러브필드는 순수 자바스크립트로 작성된 관계형 쿼리 엔진입니다.또한 Indexed 사용 등 브라우저 측에서 데이터를 유지하는 데 도움이 됩니다.데이터를 로컬로 저장하는 DB.SQL과 유사한 구문을 제공하며 크로스 브라우저(현재 Chrome 37+, Firefox 31+, IE 10+ 및 Safari 5.1+ 지원)를 지원합니다.
이 공간에서의 또 다른 흥미로운 최신 엔트리는 jinqJs입니다.
function isChild(row) {
return (row.Age < 18 ? 'Yes' : 'No');
}
var people = [
{Name: 'Jane', Age: 20, Location: 'Smithtown'},
{Name: 'Ken', Age: 57, Location: 'Islip'},
{Name: 'Tom', Age: 10, Location: 'Islip'}
];
var result = new jinqJs()
.from(people)
.orderBy('Age')
.select([{field: 'Name'},
{field: 'Age', text: 'Your Age'},
{text: 'Is Child', value: isChild}]);
jinqJs는 종속성이 없는 작고 단순하며 가볍고 확장 가능한 JavaScript 라이브러리입니다.jinqJs는 JSON 응답을 반환하는 JavaScript 배열, 컬렉션 및 웹 서비스에서 SQL과 같은 쿼리를 수행할 수 있는 간단한 방법을 제공합니다.jinqJs는 에 대한 Microsoft의 Lambda 식과 유사합니다.Net, 또한 SQL 유사 구문 및 술어 기능을 사용하여 컬렉션을 쿼리하는 유사한 기능을 제공합니다.jinqJs의 목적은 LINQ 쿼리에 익숙한 프로그래머에게 SQL 유사 경험을 제공하는 것입니다.
PythonQL은 IMHO가 SQL의 개선점이라고 하는 구문을 내장하고 있습니다.주요는 다음과 같습니다.group,window,where,let, 등은 자유롭게 혼재할 수 있습니다.
$ cat x.py
#coding: pythonql
data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
q = [x match {'x': as x, 'y': as y} in data where y > 0]
print(sum(q))
print(list(q))
q = [x match {'x': as x, 'y': as y} as d in data where d['y'] > 0]
print(sum(q))
이 코드는 전체 구조 또는 값만 처리해야 하는 필요에 따라 질문에 대한 두 가지 답변을 보여 줍니다.실행을 통해 예상된 결과를 얻을 수 있습니다.
$ python x.py
7
[3, 4]
7
당신의 Javascript를 사용하는 것에 찬성합니다만, 조금 더 복잡한 것은 dojo 데이터를 참조해 주십시오.사용한 적은 없지만 대략적으로 당신이 찾고 있는 쿼리 인터페이스를 제공하는 것 같습니다.
현재 Jaql 구현은 Hadoop 클러스터를 사용하는 대규모 데이터 처리를 대상으로 하므로 필요 이상의 성능을 제공할 수 있습니다.그러나 Hadoop 클러스터 없이도 쉽게 실행할 수 있지만 컴파일하려면 Hadoop 코드와 종속성이 필요합니다(대부분 포함).Javascript와 브라우저에 내장될 수 있는 Jaql의 작은 구현은 이 프로젝트에 훌륭한 추가가 될 것입니다.
위의 예는 jaql로 쉽게 기술됩니다.
$data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];
$data -> filter $.y > 0 -> transform $.x -> sum(); // 7
$data -> filter $.y > 0 -> transform $.x; // [3,4]
물론, 훨씬 더 많이 있습니다.예를 들어 다음과 같습니다.
// Compute multiple aggregates and change nesting structure:
$data -> group by $y = $.y into { $y, s:sum($[*].x), n:count($), xs:$[*].x};
// [{ "y": 0, "s": 2, "n": 1, "xs": [2] },
// { "y": 1, "s": 7, "n": 2, "xs": [3,4] }]
// Join multiple data sets:
$more = [{ "y": 0, "z": 5 }, { "y": 1, "z": 6 }];
join $data, $more where $data.y == $more.y into {$data, $more};
// [{ "data": { "x": 2, "y": 0 }, "more": { "y": 0, "z": 5 }},
// { "data": { "x": 3, "y": 1 }, "more": { "y": 1, "z": 6 }},
// { "data": { "x": 4, "y": 1 }, "more": { "y": 1, "z": 6 }}]
Jaql은 http://code.google.com/p/jaql/에서 다운로드/다운로드 할 수 있습니다.
Underscore.js를 사용할 수도 있습니다.Underscore.js는 기본적으로 스위스 나이프 라이브러리입니다.를 사용하여 SQL과 같은 쿼리를 수행할 수 있습니다.
var data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];
var posData = _.filter(data, function(elt) { return elt.y > 0; });
// [{"x": 3, "y": 1}, {"x": 4, "y": 1}]
var values = _.pluck(posData, "x");
// [3, 4]
var sum = _.reduce(values, function(a, b) { return a+b; });
// 7
Underscore.js는 클라이언트 측과 서버 측 모두에서 작동하며 주목할 만한 라이브러리입니다.
Lo-Dash는 Underscore.js의 포크로서 퍼포먼스가 뛰어난 Lo-Dash를 사용할 수도 있습니다.
가능하면 서버의 백엔드(SQL DB 또는 기타 네이티브 데이터베이스 유형)로 모든 쿼리를 이동합니다.그 이유는 쿼리를 실행하는 것이 더 빠르고 최적화되기 때문입니다.
jSON은 독립형일 수 있고 쿼리 언어를 사용하는 경우 +/-가 있을 수 있지만, 대부분의 JSON 사용 사례와 같이 백엔드에서 브라우저로 데이터를 검색하는 경우 이점을 알 수 없습니다.필요한 작은 데이터를 얻기 위해 백엔드에서 쿼리 및 필터링합니다.
어떤 이유로든 프런트 엔드(대부분 브라우저에서)에서 문의해야 하는 경우 어레이만 사용하는 것이 좋습니다.필터(다른 것을 발명하는 이유는 무엇입니까?)
그래서 json을 위한 변환 API가 더 유용하다고 생각합니다.데이터가 있으면 여러 가지 방법으로 표시할 수 있으므로 더 유용합니다.다만, 서버 모델을 사용하고 있는 경우는, 클라이언트보다 서버(확장이 훨씬 간단할 가능성이 있습니다)로 이 작업의 대부분을 실시할 수 있습니다.<-->클라이언트 모델을 사용하고 있는 경우.
딱 내 2펜스어치!
Python을 사용하는 경우 MongoDB의 Mini 오픈소스 버전인 MontyDB https://github.com/davidlatwe/montydb이 있습니다.MontyDB https://github.com/davidlatwe/montydb은 500개 이상의 별을 가지고 있으며 JetBrains에서 지원됩니다.
from montydb.utils import MontyList
response = [
{'namespace': 'dash_mantine_components',
'props': {'checked': True,
'id': {'index': 0, 'type': 'checkbox'},
'label': 'My first to do'},
'type': 'Checkbox'},
{'namespace': 'dash_mantine_components',
'props': {'checked': True,
'id': {'index': 1, 'type': 'checkbox'},
'label': 'My Another to do'},
'type': 'Input'},
{'namespace': 'dash_mantine_components',
'props': {'checked': False,
'id': {'index': 2, 'type': 'checkbox'},
'label': 'My next level to do'},
'type': 'Div'},
]
cli = MontyList(response)
cli.find({'props.checked': True},{'type':1})
출력:
MontyList([{'type': 'Checkbox'}, {'type': 'Input'}])
이 라이브러리는 MongoDB와 같은 느낌을 주기 때문에 다른 jsonquery 옵션보다 마음에 듭니다.
저는 JSON용 새로운 쿼리 언어인 ~Q(unquery로 발음)의 개발자입니다.다른 JSON 쿼리 언어의 많은 단점을 해결하고 사용 편의성과 표현력을 균형 있게 조정하도록 설계되었습니다.물론 메인 개발자로서 나는 편견이 있지만, 당신이 직접 확인하고 결정할 수 있다.
https://github.com/xcite-db/Unquery
OP의 예에 대해 ~Q의 쿼리는 다음과 같습니다.
{
"example1:[]" : "$sum(x)?y>0",
"example2:[]" : ["x?y>0"]
}
SQLite를 사용하고 있습니다.https://sqlite.org/json1.html
실제 SQL 언어를 사용할 수 있고 SQLite가 매우 빠르기 때문에 좋습니다.
먼저 임시 테이블을 만듭니다.
create temp table data as select value from json_each(readfile('data.json'))
다음으로 SQLite JSON 함수를 사용합니다.
select value->'$.foo' foo, count(value->'$.bar') nbar from data group by foo
언급URL : https://stackoverflow.com/questions/777455/is-there-a-query-language-for-json
'codememo' 카테고리의 다른 글
| 첫 페이지에서 검색 페이지에 로드 추가 버튼 추가 (0) | 2023.02.22 |
|---|---|
| 시스템 브라우저의 Ionic 응용 프로그램 열기 링크 (0) | 2023.02.22 |
| 이게 다음인가요?JS 폴더 구조를 권장합니다. (0) | 2023.02.22 |
| 로드된 스프링 콩을 모두 인쇄합니다(스프링 부트). (0) | 2023.02.22 |
| 각도 $scope.안전한 $190 대 $190 (0) | 2023.02.22 |