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.