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}]