SQLite json_object() функцията връща добре оформен JSON обект въз основа на неговите аргументи.
Функцията приема нула или повече двойки аргументи и връща добре оформен JSON обект въз основа на тези аргументи.
Синтаксис
json_object(label1,value1,...)
Където label1, value2, ... представлява двойките етикет/стойност.
Пример
Ето един прост пример за демонстрация:
SELECT json_object( "name", "Igor", "age", 35 ); Резултат:
{"name":"Игор","age":35} Предаване на JSON обекти
Предаването на аргумент с SQL тип TEXT води до JSON низ в кавички, като всички етикети в кавички са екранирани:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' ); Резултат:
{"user":"{ \"name\" :\"igor\", \"age\" :35 }"}
Ако не искаме това да се случи, можем да използваме json() функция за предоставяне на стойността като валиден JSON документ:
SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') ); Резултат:
{"user":{"name":"igor","age":35}}
Друг начин да го направите е да използвате -> на SQLite оператор:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' ); Резултат:
{"user":{"name":"igor","age":35}}
Като алтернатива можем да използваме друг json_object() функция:
SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) ); Резултат:
{"user":{"name":"Igor","age":35}} Ето го с някои други стойности:
SELECT json_object(
"a", 1,
"user", json_object( "name", "Igor", "age", 35 ),
"b", 2
); Резултат:
{"a":1,"user":{"name":"Igor","age":35},"b":2} Предаване на JSON масиви
Подобно нещо е и при предаване на JSON масиви:
SELECT json_object( "scores", '[ 9, 4, 7 ]' ); Резултат:
{"резултати":"[ 9, 4, 7 ]"} В този случай стойността е низ, който прилича на масив.
За да върнем действителен JSON масив, можем да предадем нашия аргумент на json() функция:
SELECT json_object( "scores", json('[ 9, 4, 7 ]') ); Резултат:
{"резултати":[9,4,7]}
Можем също да използваме -> оператор:
SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' ); Резултат:
{"резултати":[9,4,7]}
Като алтернатива можем да предадем стойностите на json_array() функция:
SELECT json_object( "scores", json_array( 9, 4, 7 ) ); Резултат:
{"резултати":[9,4,7]} Ето го с някои други двойки име/стойност:
SELECT json_object(
"name", "Bruno",
"scores", json_array( 9, 4, 7 ),
"age", 25
); Резултат:
{"name":"Bruno","cores":[9,4,7],"age":25} Създайте празен обект
Извикване на json_object() без подаване на аргументи води до празен обект:
SELECT json_object(); Резултат:
{} Дублиращи се етикети
Към момента на писане, json_object() приема дублиращи се етикети без проблем. Следователно можем да правим неща като това:
SELECT json_object( "b", 1, "b", 2 ); Резултат:
{"b":1,"b":2} Но документацията на SQLite съветва, че това може да не винаги е така – бъдещите версии на SQLite може да не поддържат такива сценарии.
Пример за база данни
Можем да използваме json_object() при извличане на данни от база данни.
Да предположим, че изпълняваме следната заявка:
SELECT * FROM Pets; Резултат:
<пред>+-------+--------+-------+| PetId | Име на домашни любимци | TypeId |+-------+--------+-------+| 1 | Омир | 3 || 2 | Йелп | 1 || 3 | Пух | 2 || 4 | Четка | 4 |+-------+--------+-------+Виждаме, че има три колони и можем да видим имената им.
Можем да използваме json_object() функция на тази маса по следния начин:
SELECT json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
FROM Pets; Резултат:
{"PetId":1,"PetName":"Homer","TypeId":3}{"PetId":2,"PetName":"Yelp","TypeId":1}{"PetId":3,"PetName":"Fluff","TypeId":2}{"PetId":4,"PetName":"Brush","TypeId":4} Тук изрично посочих имената на етикетите, след което използвах действителните колони от базата данни за стойностите. Всеки ред става JSON документ, а всяка колона става двойка ключ/стойност в този JSON документ.
Можем също да използваме json_group_array() функция за обвиване на документите в масив:
SELECT json_group_array(
json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
)
FROM Pets; Резултат:
[{"PetId":1,"PetName":"Homer","TypeId":3},{"PetId":2,"PetName":"Yelp","TypeId":1},{" PetId":3,"PetName":"Fluff","TypeId":2},{"PetId":4,"PetName":"Brush","TypeId":4}]