JSONiq
Paradygmat | deklaratywne , funkcjonalne , modułowe |
---|---|
Dyscyplina pisania | dynamiczny , mocny |
system operacyjny | Międzyplatformowe |
Rozszerzenia nazw plików | .jq, .jqy |
Strona internetowa | |
Pod wpływem | |
XQuery , SQL |
JSONiq to język programowania zapytań i funkcji , który jest przeznaczony do deklaratywnego wyszukiwania i przekształcania zbiorów hierarchicznych i heterogenicznych danych w formacie JSON , XML , a także nieustrukturyzowanych danych tekstowych.
JSONiq to otwarta specyfikacja opublikowana na licencji Creative Commons Attribution-ShareAlike 3.0 . Opiera się na XQuery , z którym dzieli te same podstawowe wyrażenia i operacje na typach atomowych. JSONiq występuje w dwóch wariantach składniowych, które natywnie obsługują JSON i XML.
- Składnia JSONiq (nadzbiór JSON) rozszerzona o obsługę XML poprzez kompatybilny podzbiór XQuery.
- Składnia XQuery (natywna obsługa XML) rozszerzona o obsługę JSON poprzez kompatybilny podzbiór (rozszerzenie JSONiq do XQuery) powyższej składni JSONiq.
Cechy
JSONiq zapewnia przede wszystkim środki do wyodrębniania i przekształcania danych z dokumentów JSON lub dowolnego źródła danych, które można postrzegać jako JSON (np. relacyjne bazy danych lub usługi sieciowe ).
Głównym wyrażeniem służącym do wykonywania takich operacji jest podobne do języka SQL „ wyrażenie FLWOR ”, które pochodzi z XQuery. Wyrażenie FLWOR jest zbudowane z pięciu klauzul, od których pochodzi jego nazwa: FOR, LET, WHERE, ORDER BY, RETURN. Obsługuje jednak również klauzule dotyczące grupowania i okienkowania.
Język zapewnia również składnię do konstruowania nowych dokumentów JSON, w których nazwy i wartości pól są znane z góry lub mogą być obliczane dynamicznie. Język JSONiq (nie rozszerzenie XQuery) jest nadzbiorem JSON. Oznacza to, że każdy dokument JSON jest prawidłowym programem JSONiq.
Ponadto język obsługuje również składnię nawigacyjną do wyodrębniania nazw pól i wartości z obiektów JSON, a także wartości z tablic JSON. Nawigacja jest odporna na brak wartości lub wartości niejednorodne, ponieważ po cichu ignoruje nieprzewidziane wartości bez zgłaszania błędów.
Wszystkie konstrukcje są zdefiniowane jako wyrażenia w języku i mogą być dowolnie zagnieżdżane.
JSONiq nie zawiera funkcji aktualizacji dokumentów JSON lub XML, nie ma możliwości wyszukiwania pełnotekstowego i nie ma instrukcji. Wszystkie te funkcje są aktywnie rozwijane dla kolejnej wersji języka.
JSONiq to język programowania, który może wyrażać dowolne transformacje JSON na JSON lub XML na XML. Pozwala także na transformacje między JSON i XML. Wszystkie takie przekształcenia mają następujące cechy:
- Logiczna/fizyczna niezależność danych
- Deklaracyjny
- Wysoki poziom
- Bez efektów ubocznych
- Mocno wpisany
Model danych
Język oparty jest na JSONiq Data Model (JDM), który jest rozszerzeniem XQuery i XPath Data Model (XDM). JDM wykorzystuje drzewiasty model zawartości informacyjnej dokumentu JSON lub XML. Zawiera obiekty JSON, tablice JSON, wszelkiego rodzaju węzły XML, a także wartości atomowe, takie jak liczby całkowite, łańcuchy znaków lub wartości logiczne, wszystkie zdefiniowane w schemacie XML .
JDM stanowi podstawę języka zorientowanego na zbiory, w którym instancje modelu danych są sekwencjami (wartość pojedyncza jest uważana za sekwencję o długości jeden). Elementami w sekwencji mogą być obiekty JSON, tablice JSON, węzły XML lub wartości niepodzielne.
Przykłady
Poniższy przykładowy kod JSONiq oblicza numer kierunkowy i liczbę wszystkich osób w wieku powyżej 20 lat z kolekcji obiektów osób w formacie JSON ( przykładowy obiekt można znaleźć w artykule JSON ).
dla $ p w kolekcji ( "persons" ) gdzie $ p.age gt 20 let $ home := $ p.phoneNumber [][ $ $. wpisz eq "dom" ] . grupa liczb według $ area := substring-before ( $ home , " " ) return { "numer kierunkowy"
: $ powierzchnia , "liczba" : liczba ( $ p ) }
Wszystkie konstrukcje JSONiq są wyrażeniami i mogą być również zawarte w treści funkcji.
zadeklaruj funkcję local:adults () { for $ p in collection ( „persons” ) gdzie $ p.age gt 20 return $ p };
Następne zapytanie przekształca części każdego obiektu osoby w element XML przy użyciu składni XQuery (rozszerzenie JSONiq do XQuery).
for $ p w kolekcji ( "persons" ) return <person> <firstName> { $ p ( "firstname" )} </firstName> <lastName> { $ p ( "lastName" )} </lastName> <wiek> { $ p ( "wiek" )} </wiek> </osoba>
Aplikacje
Poniżej znajduje się kilka przykładów tego, jak i gdzie można użyć JSONiq:
- Wyodrębnianie informacji z bazy danych do wykorzystania w usłudze sieciowej.
- Generowanie raportów podsumowujących dane przechowywane w magazynie dokumentów JSON.
- Wybór i transformacja danych JSON do XHTML w celu publikacji w sieci.
- Korelowanie danych z różnych źródeł i formatów (np. magazyn dokumentów JSON, baza danych XML, relacyjna baza danych, serwis internetowy) i oferowanie ich w serwisie internetowym.
- Przekształcanie kolekcji obiektów JSON w inny schemat.
Porównanie dwóch smaków syntaktycznych
Istnieją dwie składnie JSONiq, z których użytkownicy mogą korzystać niezależnie od tego, czy koncentrują się na JSON, czy XML. Obie składnie używają tego samego modelu danych i są bardzo podobne do kilku wyjątków.
Składnia JSONiq
Czysta składnia JSONiq jest nadzbiorem JSON. Ściśle mówiąc, nie jest to nadzbiór XQuery, mimo że dostępne są wszystkie jego wyrażenia i semantyka. Następujące aspekty składni JSONiq nie są zgodne z XQuery:
- Brak nazw zawierających kropki.
- NIE . dla elementu kontekstu (zamiast tego należy użyć $$).
- Brak literałów w pojedynczych cudzysłowach.
- JSON, ucieczka oparta na odwrotnym ukośniku w literałach łańcuchowych .
- Żaden krok osi nie jest dozwolony na początku wyrażenia ścieżki względnej.
Składnia XQuery z rozszerzeniem JSONiq
Rozszerzenie JSONiq do XQuery jest nadzbiorem XQuery, ale nie nadzbiorem JSON. Jest w pełni zgodny i wstecznie kompatybilny z rekomendacją kandydata XQuery 3.0. Następujące aspekty JSONiq nie są obsługiwane w składni XQuery.
- Brak wyszukiwania obiektów opartego na kropkach (zamiast tego $object("key")).
- Brak $$ dla elementu kontekstu.
- XML, oparte na znaku ampersand uciekanie literałów łańcuchowych.
- Klucze obiektów muszą być podane w cudzysłowach
- Brak literałów true/false/null
- Wbudowane typy atomowe muszą być poprzedzone przedrostkiem xs:.
- Po typach nieatomowych należy umieścić nawiasy.
- Pusta-sekwencja() musi być zapisana jako taka.
- Bez wyszukiwania tablicy i bez rozpakowywania tablicy [].
Dalsza lektura
- JSONiq — SQL NoSQL. Ghislaina Fourny'ego. Niezależna platforma wydawnicza CreateSpace. ISBN 1489530371 .
Implementacje
- Zorba : rozszerzenie JSONiq i JSONiq do XQuery
- IBM WebSphere : rozszerzenie JSONiq do XQuery
- Narzędzia internetowe BeniBela : rozszerzenie JSONiq do XQuery