Podczas wyszukiwania elementów w złożonych tablicach i skrótach JSON, takich jak:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Czy istnieje jakiś język zapytań, za pomocą którego można znaleźć element in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
źródło
źródło
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
zawierającą obiekt JSON, napisałbyś:jsel(data).select("//*[@id=3]")
i zwróciłby obiekt zawierający klucz id z 3.Odpowiedzi:
Tak, nazywa się JSONPath . Źródło znajduje się teraz na GitHub .
Jest również zintegrowany z DOJO .
źródło
Myślę, że JSONQuery jest nadzbiorem JSONPath i dlatego zastępuje go w dojo . Jest też RQL .
Z dokumentacji Dojo:
JSONselect ma inny punkt widzenia na pytanie (podobny do selektora CSS, a nie XPath) i ma implementację JavaScript .
źródło
Inne znane mi alternatywy
HTH.
źródło
Aby podsumować niektóre z bieżących opcji przeglądania / filtrowania danych JSON i podać kilka przykładów składni ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (zainspirowany bardziej przez selektory CSS)
.automobiles .maker:val("Honda") .model
JSONPath (zainspirowany bardziej przez XPath)
$.automobiles[?(@.maker='Honda')].model
Myślę, że JSPath wygląda najlepiej, więc spróbuję zintegrować go z moją aplikacją AngularJS + CakePHP.
(Oryginalnie zamieściłem tę odpowiedź w innym wątku, ale pomyślałem, że tutaj też się przyda.)
źródło
Spróbuj użyć JSPath
JSPath to język specyficzny dla domeny (DSL), który umożliwia nawigację i wyszukiwanie danych w dokumentach JSON. Korzystając z JSPath, możesz wybierać elementy JSON w celu odzyskania zawartych w nich danych.
JSPath dla JSON jak XPath dla XML.
Jest mocno zoptymalizowany zarówno dla Node.js, jak i nowoczesnych przeglądarek.
źródło
XQuery może być użyty do zapytania JSON, pod warunkiem, że procesor oferuje obsługę JSON. Jest to prosty przykład, w jaki sposób można użyć BaseX do znajdowania obiektów o „id” = 1:
źródło
JQ definiuje J SON q język uery, który jest bardzo podobny do JSONPath - patrz https://github.com/stedolan/jq/wiki/For-JSONPath-users
Zakładam, że oznacza to: znajdź wszystkie obiekty JSON pod określonym kluczem o id == 3, bez względu na to, gdzie może być ten obiekt. Odpowiednie zapytanie jq byłoby:
gdzie „|” jest operatorem potoku (jak w potoku powłoki poleceń) i gdzie segment „.. | obiekty” odpowiada „bez względu na to, gdzie może być ten obiekt”.
Podstawy jq są w dużej mierze oczywiste, intuicyjne lub przynajmniej dość proste, a większość pozostałych jest łatwa do zrozumienia, jeśli w ogóle znasz potoki poleceń. Często zadawane pytania dotyczące jq zawierają wskaźniki do samouczków i tym podobne.
jq jest również jak SQL, ponieważ obsługuje operacje CRUD, chociaż procesor jq nigdy nie zastępuje danych wejściowych. jq może również obsługiwać strumienie jednostek JSON.
Dwa inne kryteria, które warto rozważyć przy ocenie języka zapytań JSON, to:
źródło
Defiant.js wygląda również całkiem fajnie, oto prosty przykład:
źródło
Wydaje się, że Json Pointer również zyskuje coraz większe poparcie.
źródło
Jsel jest niesamowity i opiera się na prawdziwym silniku XPath. Umożliwia tworzenie wyrażeń XPath w celu znalezienia dowolnego rodzaju danych JavaScript, nie tylko obiektów (również łańcuchów).
Możesz tworzyć niestandardowe schematy i odwzorowania, aby dać ci pełną kontrolę nad tym, jak twoje dane są dostępne do przejścia przez silnik XPath. Schemat to sposób definiowania sposobu definiowania elementów, elementów podrzędnych, atrybutów i wartości węzłów w danych. Następnie możesz stworzyć własne wyrażenia, które będą pasować.
Biorąc pod uwagę, że masz zmienną o nazwie
data
JSON z pytania, możesz użyć jsel do napisania:Zwróci to dowolny węzeł z
id
atrybutem 3. Atrybut to dowolna pierwotna wartość (ciąg, liczba, data, wyrażenie regularne) w obiekcie.źródło
ObjectPath to język zapytań podobny do XPath lub JSONPath, ale o wiele bardziej wydajny dzięki wbudowanym obliczeniom arytmetycznym, mechanizmom porównywania i wbudowanym funkcjom. Zobacz składnię:
Znajdź w sklepie wszystkie buty w kolorze czerwonym i cenie mniejszej niż 50
$ .. buty. * [kolor jest „czerwony”, a cena <50]
źródło
@Naftule - za pomocą „defiant.js” możliwe jest zapytanie o strukturę JSON za pomocą wyrażeń XPath. Sprawdź tego oceniającego, aby dowiedzieć się, jak to działa:
http://www.defiantjs.com/#xpath_evaluator
W przeciwieństwie do JSONPath, „defiant.js” zapewnia pełną obsługę składni zapytania - XPath w strukturach JSON.
Kod źródłowy defiant.js można znaleźć tutaj:
https://github.com/hbi99/defiant.js
źródło
JMESPath wydaje się obecnie bardzo popularny (od 2020 r.) I rozwiązuje szereg problemów z JSONPath. Jest dostępny dla wielu języków.
źródło
Jeśli jesteś podobny do mnie i chcesz po prostu przeglądać ścieżki, ale nie przejmuj się prawdziwym XPath, lodash
_.get()
może działać. Przykład z dokumentów Lodash:źródło
Wypróbuj to - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Jest to bardzo prosta implementacja w podobnej linii xpath dla xml. Nazywa się jpath.
źródło