SQLite json_replace()
функцията ни позволява да заменим съществуваща стойност в JSON документ с друга стойност.
Предаваме оригиналния JSON като първи аргумент, когато извикаме функцията, последван от пътя на стойността за замяна, последван от стойността за замяна.
Можем също да заменим няколко двойки ключ/стойност, ако е необходимо.
Синтаксис
Работи така:
json_replace(json, path1, value1, path2, value2...)
Където json
представлява оригиналния JSON и path1, value1, path2, value2...
са двойки път/стойност за замяна.
Пример
Ето основен пример за демонстрация:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
Резултат:
{"name":"Baldy"}
Тук актуализирах стойността на name
ключ от Fluffy
до Baldy
.
Можем да актуализираме множество двойки ключ/стойност по следния начин:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
Резултат:
{"name":"Baldy","age":11}
Просто добавих още аргументи ключ/стойност, когато извиках json_replace()
.
Тук използвах прекъсвания на редове, за да направя кода по-лесен за четене. Можеше всичко да е на един ред – резултатът щеше да е същият.
Ами ако ключът не съществува?
Ако ключът вече не съществува в JSON, нищо не се заменя:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
Резултат:
{"name":"Fluffy"}
Това е основната характеристика, която отличава json_replace()
функция от json_set()
и json_insert()
функции. Тези функции ще вмъкнат стойността, ако ключът все още не съществува.
Възможно е обаче ефективно да вмъкнете нови ключове с json_replace()
чрез замяна на целия JSON обект/документ. Пример по-долу.
Заменете целия JSON документ
Можем да използваме json_replace()
за да замените целия JSON документ с друг:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
Резултат:
{"name":"Baldy"}
Така че това ни позволява ефективно да вмъкваме нови ключове в документа:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
Резултат:
{"name":"Baldy","age":11}
Строго погледнато, не сме поставили нови ключове. Просто сменихме целия документ. Но резултатът беше JSON документ, който съдържа ключове, които оригиналният не съдържаше.
Заменете вграден обект
Можем също да заменим вградени обекти:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
Резултат:
{"a":1,"b":{"c":2}}
Когато направих това, използвах json()
функция, за да върне аргумента ми като JSON низ. Ето какво се случва, когато не го направя:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
Резултат:
{"a":1,"b":"{ \"c\" : 2 }"}
JSON документът се вмъква като текстова стойност вместо JSON обект и следователно неговите двойни кавички се екранират с обратна наклонена черта.
Не можем обаче просто да премахнем единичните кавички, защото това води до грешка:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
Резултат:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
Без единични кавички или json()
функция, получаваме грешка веднага щом срещне лявата фигурна скоба. Следователно трябва да използваме единични кавички или json()
функция, в зависимост от това дали вмъкваме JSON обект или SQL низ/текстова стойност.
Друг начин да вмъкнете JSON обект е да използвате json_object()
функция вместо json()
функция:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
Резултат:
{"a":1,"b":{"c":2}}
Заменете масив
Същата концепция важи и за масивите:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
Резултат:
{"a":[5,6,7]}
Ако премахнем json()
функция, получаваме това:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
Резултат:
{"a":"[ 5, 6, 7 ]"}
И ако премахнем единичните кавички, получаваме грешка:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
Резултат:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
Като алтернатива можем да използваме json_array()
функция вместо json()
. Тази функция ви позволява да създадете масив въз основа на неговите аргументи:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
Резултат:
{"a":[5,6,7]}
Добавяне на стойности в края на масив
За да добавим стойности в края на масив, можем да използваме или json_insert()
или json_set()
функции.
Ако обаче трябва да използваме json_replace()
, можем да заменим целия масив с друг, който има допълнителни стойности, добавени към края на масива:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
Резултат:
[1,2,3,4]
Но както споменахме, json_insert()
и json_set()
ви позволяват действително да добавяте стойности към масива, без да заменяте целия масив.
Замяна на елементи на масив
Ето пример за използване на json_replace()
за да замените елемент в масив:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
Резултат:
[1,4,3]
Масивите са базирани на нула и така [1]
обозначава втория елемент от масива.
json_set()
функцията може да се използва и за замяна на съществуващи елементи. Въпреки това, json_insert()
функцията не ни позволява да заменим съществуващите елементи.
Невалидни пътища
Ще получим грешка, ако пътят ни не е добре оформен:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
Резултат:
Runtime error: JSON path error near 'a'
В този случай забравих да включа $.
в предната част на пътеката.
Невалидни JSON документи
Ще получим и грешка, че JSON не е добре оформен:
SELECT json_replace('{ "a" : 1', '$.a', 2);
Резултат:
Runtime error: malformed JSON
Този път грешката ни казва, че нашият JSON е неправилно оформен.