Можем да използваме SQLite json_remove()
функция за премахване на един или повече елементи от JSON обект или масив.
Ние предаваме оригиналния JSON като първи аргумент, когато извикаме функцията, последван от един или повече пътища, които определят кои елементи да премахнем. Под „елементи“ имам предвид или елементи на масив, или членове на обект (двойки ключ/стойност).
Синтаксис
Синтаксисът е така:
json_remove(X,P,...)
Където X
представлява оригиналния JSON и P,...
представлява пътя/ите за изтриване.
Пример
Ето пример за демонстрация:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Резултат:
{"name":"Fluffy"}
Тук посочихме $.age
път и това беше премахнато от JSON документа.
Премахване на множество членове
Можем да премахнем множество членове от JSON обект, като посочим множество пътища, разделени със запетая:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Резултат:
{"name":"Fluffy"}
Масиви
Можем да премахнем елементите на масива, като посочим индекса на елемента:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Резултат:
[0,1,3]
Масивите са базирани на нула и така броенето започва от 0
.
Важно е обаче да имате предвид реда, в който се правят премахванията. Премахванията се извършват последователно отляво надясно. Промените, причинени от предишни премахвания, могат да повлияят на търсенето на пътя за последващи аргументи.
Ето пример за това как това може да повлияе на нашия резултат:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Резултат:
[1,2]
В този случай елемент на масива 0
беше изтрит първо, след това елемент от масив 2
беше изтрит от останалия масив. С други думи, вторият път премахна елемента от масива, след като първият път вече е бил премахнат.
Полученият масив е такъв, който може да не сме очаквали. Вместо да премахвате елементи 0
и 2
от оригиналния масив, премахнахме елементи 0
и 3
от оригиналния масив.
Можем да преодолеем този проблем, като пренаредим пътищата:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Резултат:
[1,3]
Няма пътища
Аргументите на пътя всъщност не са задължителни. Ако извикаме json_remove()
без аргументи за път, той връща минимизирана версия на входния JSON (т.е. с премахнати излишни празни интервали):
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Резултат:
{"name":"Fluffy","type":"Cat","age":10}
Това е същият резултат, който бихме получили, ако използваме json()
функция вместо json_remove()
.
Несъществуващ път
Посочването на път, който не съществува във входния JSON, води до връщане на оригиналния JSON, непроменен:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Резултат:
{"name":"Fluffy","age":10}
Невалидни пътища
Ще получим грешка, ако пътят ни не е добре оформен:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Резултат:
Runtime error: JSON path error near 'age'
В този случай забравих да включа $.
в предната част на пътеката.
Невалидни JSON документи
Ще получим и грешка, че JSON не е добре оформен:
SELECT json_remove('{ "name" : "Fluffy", "age" }', '$.age');
Резултат:
Runtime error: malformed JSON
Този път грешката ни казва, че нашият JSON е неправилно оформен.