SQLite json_object()
funkcja zwraca poprawnie sformatowany obiekt JSON na podstawie jego argumentów.
Funkcja akceptuje zero lub więcej par argumentów i zwraca prawidłowo sformatowany obiekt JSON na podstawie tych argumentów.
Składnia
json_object(label1,value1,...)
Gdzie label1, value2, ...
reprezentuje pary etykieta/wartość.
Przykład
Oto prosty przykład do zademonstrowania:
SELECT json_object( "name", "Igor", "age", 35 );
Wynik:
{"name":"Igor","age":35}
Przekazywanie obiektów JSON
Przekazanie argumentu z typem SQL typu TEXT powoduje powstanie ciągu JSON w cudzysłowie, ze znakami ucieczki wszystkich etykiet w cudzysłowie:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' );
Wynik:
{"user":"{ \"name\" : \"igor\", \"age\" : 35 }"}
Jeśli nie chcemy, aby tak się stało, możemy użyć json()
funkcja do podania wartości jako prawidłowego dokumentu JSON:
SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') );
Wynik:
{"user":{"name":"igor","age":35}}
Innym sposobem na to jest użycie ->
SQLite operator:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' );
Wynik:
{"user":{"name":"igor","age":35}}
Alternatywnie możemy użyć innego json_object()
funkcja:
SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) );
Wynik:
{"user":{"name":"Igor","age":35}}
Oto kilka innych wartości:
SELECT json_object(
"a", 1,
"user", json_object( "name", "Igor", "age", 35 ),
"b", 2
);
Wynik:
{"a":1,"user":{"name":"Igor","age":35},"b":2}
Przekazywanie tablic JSON
Podobnie jest z przekazywaniem tablic JSON:
SELECT json_object( "scores", '[ 9, 4, 7 ]' );
Wynik:
{"scores":"[ 9, 4, 7 ]"}
W tym przypadku wartością jest ciąg przypominający tablicę.
Aby zwrócić rzeczywistą tablicę JSON, możemy przekazać nasz argument do json()
funkcja:
SELECT json_object( "scores", json('[ 9, 4, 7 ]') );
Wynik:
{"scores":[9,4,7]}
Możemy również użyć ->
operator:
SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' );
Wynik:
{"scores":[9,4,7]}
Alternatywnie możemy przekazać wartości do json_array()
funkcja:
SELECT json_object( "scores", json_array( 9, 4, 7 ) );
Wynik:
{"scores":[9,4,7]}
Oto kilka innych par nazwa/wartość:
SELECT json_object(
"name", "Bruno",
"scores", json_array( 9, 4, 7 ),
"age", 25
);
Wynik:
{"name":"Bruno","scores":[9,4,7],"age":25}
Utwórz pusty obiekt
Wywołanie json_object()
bez przekazywania żadnych argumentów powoduje powstanie pustego obiektu:
SELECT json_object();
Wynik:
{}
Zduplikowane etykiety
W chwili pisania tego tekstu json_object()
akceptuje zduplikowane etykiety bez problemu. Dlatego możemy robić takie rzeczy:
SELECT json_object( "b", 1, "b", 2 );
Wynik:
{"b":1,"b":2}
Ale dokumentacja SQLite informuje, że nie zawsze tak jest – przyszłe wersje SQLite mogą nie obsługiwać takich scenariuszy.
Przykład bazy danych
Możemy użyć json_object()
podczas pobierania danych z bazy danych.
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT * FROM Pets;
Wynik:
+-------+---------+--------+ | PetId | PetName | TypeId | +-------+---------+--------+ | 1 | Homer | 3 | | 2 | Yelp | 1 | | 3 | Fluff | 2 | | 4 | Brush | 4 | +-------+---------+--------+
Widzimy, że są trzy kolumny i widzimy ich nazwy.
Możemy użyć json_object()
funkcjonować na tym stole w ten sposób:
SELECT json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
FROM Pets;
Wynik:
{"PetId":1,"PetName":"Homer","TypeId":3} {"PetId":2,"PetName":"Yelp","TypeId":1} {"PetId":3,"PetName":"Fluff","TypeId":2} {"PetId":4,"PetName":"Brush","TypeId":4}
Tutaj wyraźnie określiłem nazwy etykiet, a następnie jako wartości użyłem rzeczywistych kolumn z bazy danych. Każdy wiersz staje się dokumentem JSON, a każda kolumna staje się parą klucz/wartość w tym dokumencie JSON.
Możemy również użyć json_group_array()
funkcja zamykająca dokumenty w tablicy:
SELECT json_group_array(
json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
)
FROM Pets;
Wynik:
[{"PetId":1,"PetName":"Homer","TypeId":3},{"PetId":2,"PetName":"Yelp","TypeId":1},{"PetId":3,"PetName":"Fluff","TypeId":2},{"PetId":4,"PetName":"Brush","TypeId":4}]