Czy istnieje (w przybliżeniu) język SQL lub XQuery podobny do zapytania JSON?
Myślę o bardzo małych zestawach danych, które ładnie odwzorowują na JSON, w których miło byłoby łatwo odpowiedzieć na zapytania, takie jak „jakie są wszystkie wartości X, gdzie Y> 3” lub wykonać zwykłe operacje typu SUMA / LICZBA.
Jako całkowicie wymyślony przykład, coś takiego:
[{"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])
Myślę, że działałoby to zarówno po stronie klienta, jak i po stronie serwera, a wyniki były konwertowane do odpowiedniej struktury danych specyficznej dla języka (lub być może przechowywane jako JSON)
Szybki Googling sugeruje, że ludzie pomyśleli o tym i wdrożyli kilka rzeczy ( JAQL ), ale nie wydaje się, aby pojawiło się jeszcze standardowe użycie lub zestaw bibliotek. Chociaż każda funkcja jest dość trywialna do samodzielnego wdrożenia, jeśli ktoś już to zrobił poprawnie, nie chcę ponownie wymyślać koła.
Jakieś sugestie?
Edycja: To może być zły pomysł lub JSON może być zbyt ogólnym formatem do tego, co myślę. Powodem, dla którego chcę języka zapytań zamiast po prostu wykonywania funkcji sumowania / etc bezpośrednio w razie potrzeby, jest to, że mam nadzieję zbudować zapytania dynamicznie oparte na danych wprowadzanych przez użytkownika. Niby argument, że „nie potrzebujemy SQL, możemy po prostu napisać potrzebne funkcje”. W końcu to wymyka się spod kontroli lub kończy się pisanie własnej wersji języka SQL, gdy idzie się o krok dalej. (Okej, wiem, że to trochę głupiutki argument, ale masz pomysł ...)
Odpowiedzi:
Jasne, a może:
Wszystkie wydają się być w toku, ale do pewnego stopnia działają. Są one również podobne do XPath i XQuery pod względem koncepcyjnym; mimo że XML i JSON mają różne modele pojęciowe (hierarchiczne vs obiekt / struktura).
EDYCJA września 2015: W rzeczywistości istnieje teraz standard JSON Pointer, który umożliwia bardzo proste i wydajne przechodzenie zawartości JSON. Jest nie tylko formalnie określony, ale także obsługiwany przez wiele bibliotek JSON. Nazwałbym go więc rzeczywistym, użytecznym standardem, chociaż ze względu na jego ograniczoną ekspresyjność może, ale nie musi, być uważany za język zapytań per se.
źródło
Poleciłbym mój projekt, nad którym pracuję, o nazwie jLinq . Szukam opinii, więc chciałbym usłyszeć, co myślisz.
Jeśli pozwala na pisanie zapytań podobnych do tego w LINQ ...
Jest również w pełni rozszerzalny!
Dokumentacja jest wciąż w toku, ale nadal możesz spróbować w Internecie.
źródło
Aktualizacja: XQuery 3.1 może wysyłać zapytania do XML lub JSON - lub do obu jednocześnie. I XPath 3.1 też może.
Lista rośnie:
źródło
jmespath działa naprawdę dość łatwo i dobrze, http://jmespath.org/ Jest używany przez Amazon w interfejsie wiersza poleceń AWS, więc musi być całkiem stabilny.
źródło
jmespath
tego--query
parametru, ale zaleca sięjq
dla potoków wiersza poleceń. docs.aws.amazon.com/cli/latest/userguide/…jq jest J SON q język uery przeznaczony głównie do linii poleceń, ale z powiązaniami do szerokiej gamy języków programowania (Java, node.js, php, ...) i nawet dostępnych w przeglądarce poprzez JQ-web .
Oto kilka ilustracji opartych na oryginalnym pytaniu, które podało ten JSON jako przykład:
Składnia jq rozszerza składnię JSON
Każde wyrażenie JSON jest prawidłowym wyrażeniem jq i wyrażeniami takimi jak
[1, (1+1)]
i {"a": (1 + 1)} `pokazują, jak jq rozszerza składnię JSON.Bardziej przydatnym przykładem jest wyrażenie jq:
który, biorąc pod uwagę wartość JSON
{"a":1, "b":2, "c": 3}
, ocenia na{"a":1, "b":2}
.źródło
Wbudowana
array.filter()
metoda powoduje, że większość tak zwanych bibliotek zapytań javascript staje się przestarzałaMożesz umieścić w delegacie tyle warunków, ile możesz sobie wyobrazić: proste porównanie, startWith itp. Nie testowałem, ale prawdopodobnie możesz również zagnieżdżać filtry do odpytywania wewnętrznych kolekcji.
źródło
array.filter()
jest częścią JavaScript, a nie JSON.Jeśli używasz platformy .NET, Json.NET obsługuje zapytania LINQ ponad JSON. Ten post zawiera kilka przykładów. Obsługuje filtrowanie, mapowanie, grupowanie itp.
źródło
ObjectPath jest prostym językiem zapytań dla dokumentów JSON o złożonej lub nieznanej strukturze. Jest podobny do XPath lub JSONPath, ale o wiele bardziej wydajny dzięki wbudowanym obliczeniom arytmetycznym, mechanizmom porównywania i wbudowanym funkcjom.
Wersja Python jest dojrzała i używana w produkcji. JS jest wciąż w fazie beta.
Prawdopodobnie w najbliższej przyszłości zapewnimy pełną wersję Javascript. Chcemy również dalej go rozwijać, aby mógł służyć jako prostsza alternatywa dla zapytań Mongo.
źródło
Innym sposobem, aby na to spojrzeć, jest użycie mongoDB Możesz przechowywać JSON w mongo, a następnie wykonać zapytanie za pomocą składni zapytania mongodb.
źródło
OK, ten post jest trochę stary, ale ... jeśli chcesz wykonać zapytanie podobne do SQL w natywnym JSON (lub obiektach JS) na obiektach JS, spójrz na https://github.com/deitch/searchjs
Jest to zarówno język jsql napisany całkowicie w JSON, jak i implementacja referencyjna. Możesz powiedzieć: „Chcę znaleźć cały obiekt w tablicy o nazwie ===„ John ”&& age === 25 jako:
Searchjs implementacji referencyjnej działa zarówno w przeglądarce, jak i jako pakiet npm węzła
Może także wykonywać takie czynności, jak złożone sprzężenia i negacja (NIE). Natywnie ignoruje wielkość liter.
Nie robi jeszcze sumowania ani się nie liczy, ale prawdopodobnie łatwiej jest robić to na zewnątrz.
źródło
Oto kilka prostych bibliotek javascript, które również wykonają tę sztuczkę:
jFunk to język zapytań w toku, o składni podobnej do selektorów CSS / jQuery. Wyglądało to obiecująco, ale nie miało żadnego rozwoju poza początkowym zatwierdzeniem.
(dodano 2014): narzędzie wiersza polecenia jq ma zgrabną składnię, ale niestety jest to biblioteka ac. Przykładowe użycie:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
źródło
W MongoDB tak to by działało (w powłoce mongo istnieją sterowniki dla wybranego języka).
Pierwsze trzy polecenia wstawiają dane do Twojej kolekcji. (Wystarczy uruchomić
mongod
serwer i połączyć się zmongo
klientem).Następne dwa przetwarzają dane.
$match
filtry,$group
stosuje odpowiedniosum
ilist
.źródło
O ile wiem, SpahQL jest najbardziej obiecującą i przemyślaną z nich. Bardzo polecam to sprawdzić.
źródło
Właśnie skończyłem wydaną wersję JS-lib po stronie klienta (defiant.js), która robi to, czego szukasz. Za pomocą defiant.js można wyszukiwać w strukturze JSON za pomocą znanych Ci wyrażeń XPath (bez nowych wyrażeń składniowych jak w JSONPath).
Przykład tego, jak to działa (zobacz w przeglądarce tutaj http://defiantjs.com/defiant.js/demo/sum.avg.htm ):
Jak widać, DefiantJS rozszerza globalny obiekt JSON o funkcję wyszukiwania, a zwrócona tablica jest dostarczana z funkcjami agregującymi. DefiantJS zawiera kilka innych funkcji, ale są one poza zakresem tego tematu. W każdym razie możesz przetestować bibliotekę za pomocą narzędzia XPath Evaluator. Myślę, że ludzie, którzy nie znają XPath, uznają to za przydatne.
http://defiantjs.com/#xpath_evaluator
Więcej informacji o defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js
Mam nadzieję, że okaże się przydatny ... Pozdrawiam
źródło
Google ma projekt o nazwie lovefield ; właśnie się o tym dowiedziałem i wygląda interesująco, choć jest bardziej zaangażowany niż zwykłe dodawanie podkreślenia lub lodash.
https://github.com/google/lovefield
Kolejny interesujący ostatni wpis w tej przestrzeni o nazwie jinqJs .
http://www.jinqjs.com/
Krótko przeglądając przykłady , wygląda obiecująco, a dokument API wydaje się być dobrze napisany.
źródło
Będę popierać pojęcie używania własnego javascript, ale dla czegoś bardziej wyrafinowanego możesz spojrzeć na dane dojo . Nie korzystałem z niego, ale wygląda na to, że daje z grubsza rodzaj interfejsu zapytań, którego szukasz.
źródło
Obecna implementacja Jaql jest ukierunkowana na przetwarzanie dużych danych za pomocą klastra Hadoop, więc może być więcej niż potrzebujesz. Działa jednak łatwo bez klastra Hadoop (ale nadal wymaga kodu Hadoop i jego zależności do skompilowania, które są w większości uwzględnione). Niewielka implementacja Jaql, która mogłaby być osadzona w JavaScript i przeglądarce, byłaby świetnym dodatkiem do projektu.
Powyższe przykłady można łatwo napisać w języku jaql:
Oczywiście jest o wiele więcej. Na przykład:
Jaql można pobrać / omówić na stronie http://code.google.com/p/jaql/
źródło
Możesz także użyć Underscore.js, który jest w zasadzie biblioteką szwajcarskiego noża do manipulowania kolekcjami. Za pomocą
_.filter
,_.pluck
,_.reduce
można zrobić SQL-like zapytaniami.Underscore.js działa zarówno po stronie klienta, jak i serwera i jest znaczącą biblioteką.
Możesz także użyć Lo-Dash, który jest rozwidleniem Underscore.js o lepszych osiągach.
źródło
Ilekroć jest to możliwe, przenoszę wszystkie zapytania do zaplecza na serwerze (do SQL DB lub innego rodzimego typu bazy danych). Powodem jest to, że będzie ono szybsze i bardziej zoptymalizowane do wykonywania zapytań.
Wiem, że jSON może być samodzielny i może istnieć +/- za język zapytań, ale nie widzę korzyści, jeśli pobierasz dane z backendu do przeglądarki, ponieważ większość przypadków użycia JSON. Zapytaj i przefiltruj na zapleczu, aby uzyskać jak najmniej potrzebnych danych.
Jeśli z jakiegokolwiek powodu potrzebujesz zapytań na interfejsie (głównie w przeglądarce), sugerowałbym użycie array.filter (po co wymyślać coś innego?).
To powiedziawszy, to, co moim zdaniem byłoby bardziej użyteczne, to API transformacji dla json ... są one bardziej przydatne, ponieważ kiedy już masz dane, możesz chcieć je wyświetlić na wiele sposobów. Jednak znowu możesz zrobić wiele z tego na serwerze (co może być znacznie łatwiejsze do skalowania) niż na kliencie - JEŻELI używasz modelu serwera <--> klienta.
Tylko moje 2 pensy warte!
źródło
Sprawdź https://github.com/niclasko/Cypher.js (uwaga: jestem autorem)
Jest to implementacja JavaScript języka zapytań bazy danych wykresów Cypher w zerowej zależności oraz baza danych grafów. Działa w przeglądarce (testowana z Firefox, Chrome, IE).
Z odniesieniem do pytania. Można go użyć do zapytania o punkty końcowe JSON:
Oto przykład zapytania do złożonego dokumentu JSON i wykonania na nim analizy:
Przykład zapytania Cypher.js JSON
źródło
PythonQL oferuje wbudowany składni że IMHO jest poprawa na SQL, głównie dlatego
group
,window
,where
,let
, itd. Mogą być dowolnie mieszane.Ten kod pokazuje dwie różne odpowiedzi na twoje pytanie, w zależności od potrzeby obsługi całej struktury lub tylko wartości. Wykonanie daje oczekiwany wynik.
źródło
Możesz użyć
linq.js
.Pozwala to na użycie agregacji i wyborów z zestawu danych obiektów, podobnie jak innych danych struktur.
źródło