Korzystając z SQLite, możemy użyć następujących metod do wyodrębnienia danych z dokumentu JSON.
json_extract() Funkcja
Jak sama nazwa wskazuje, json_extract() funkcja wyodrębnia i zwraca jedną lub więcej wartości z dobrze sformatowanego JSON.
Przykład:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
); Wynik:
{"name":"Bark","scores":[3,4,8,7]}
Tablice są oparte na zerach, więc licznik zaczyna się od 0 . Dlatego określiliśmy [1] aby uzyskać drugi element w psach tablica, która akurat jest obiektem JSON.
Możemy zwrócić tylko imię psa z tej pozycji w tablicy, dodając do naszej ścieżki:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
); Wynik:
Bark
Możemy użyć json_extract() aby zwrócić wiele ścieżek:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
); Wynik:
["Wag","Bark","Woof"]
Kiedy wyodrębniamy wartości z wielu ścieżek, wartości są zwracane w postaci tablicy.
-> Operator
-> operator wyodrębnia podkomponent z dokumentu JSON i zwraca reprezentację JSON tego podkomponentu.
Dlatego możemy zmienić pierwszy przykład na następujący:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]'; Wynik:
{"name":"Bark","scores":[3,4,8,7]}
-> operator jest nieco inny niż json_extract() funkcja:
->operator zawsze zwraca reprezentację JSON podkomponentu.json_extract()funkcja zwraca JSON tylko wtedy, gdy istnieją dwa lub więcej argumentów ścieżki (ponieważ wynikiem jest wtedy tablica JSON) lub jeśli pojedynczy argument ścieżki odwołuje się do tablicy lub obiektu.- Jeśli istnieje tylko jeden argument ścieżki i ta ścieżka odwołuje się do wartości null JSON, ciągu lub wartości liczbowej, wówczas
json_extract()zwraca odpowiednią wartość SQL NULL, TEXT, INTEGER lub REAL.
Dlatego oto, co się dzieje, gdy wyodrębnimy imię psa z naszego JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name'; Wynik:
"Bark"
Tym razem jest otoczony cytatami. To dlatego, że zwrócił reprezentację wartości w formacie JSON. Kiedy wyodrębniliśmy tę samą wartość za pomocą json_extract() wcześniej otrzymaliśmy reprezentację wartości SQL.
Możemy jednak również użyć ->> operator zwracający reprezentację SQL.
->> Operator
->> operator działa tak samo jak -> operator, z wyjątkiem tego, że ->> zwraca reprezentację SQL określonego podkomponentu. W szczególności zwraca TEKST SQL , INTEGER , PRAWDZIWE lub NULL wartość reprezentująca wybrany podskładnik lub NULL jeśli podkomponent nie istnieje.
Dlatego oto, co się dzieje, gdy używamy ->> operator do wyodrębnienia imienia psa:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name'; Wynik:
Bark
Nie jest już ujęty w cudzysłowy.