В SQLite, json_patch()
функцията може да се използва за добавяне, модифициране или изтриване на елементи от JSON обект.
За да направи това, той изпълнява алгоритъма RFC-7396 MergePatch, за да приложи дадена корекция към дадения JSON вход.
Предаваме оригиналния JSON като първи аргумент, когато извикаме функцията, последван от корекцията. След това функцията прилага тази корекция срещу JSON в първия аргумент.
Синтаксис
Синтаксисът е така:
json_patch(T,P)
Където T
представлява оригиналния JSON и P
е пластирът. Функцията прилага корекция P
срещу T
.
Съдържанието на предоставения пластир P
се сравнява с текущото съдържание на целевия JSON документ T
. Ако P
съдържа членове, които не се появяват в T
, тези членове се добавят. Ако T
съдържа члена, стойността се заменя.
Нулеви стойности в P
им е дадено специално значение, за да обозначат премахването на съществуващи стойности в T
.
Примери
Ето няколко примера за демонстрация.
Вмъкване
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Резултат:
{"name":"Fluffy","age":10}
Опитът за вмъкване на нов член с нулева стойност не работи:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Резултат:
{"name":"Fluffy"}
Нулеви стойности всъщност се използват за премахване на членове от JSON (както се вижда в по-късен пример).
Актуализиране
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Резултат:
{"name":"Baldy"}
Ако има няколко двойки ключ/стойност, но искаме да актуализираме само една, трябва само да посочим тази във втория си аргумент:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Резултат:
{"name":"Baldy","age":10}
Същата концепция се прилага при актуализиране на множество двойки ключ/стойност – трябва само да посочим тези:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Резултат:
{"name":"Baldy","type":"Cat","age":11}
Актуализиране и вмъкване
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Резултат:
{"name":"Baldy","age":10}
Изтриване/Премахване
Нулевите стойности в корекцията за сливане имат специално значение, за да укажат премахването на съществуващи стойности в целта:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Резултат:
{"name":"Fluffy"}
Масиви
json_patch()
функцията не може да добавя елементи към масив, нито да променя отделни елементи от масив. Може само да вмъква, заменя или изтрива целия масив като единична единица.
И така, ето пример за добавяне на елемент към масив:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Резултат:
[1,2,3,4]
Трябваше да заменя оригиналния масив с изцяло нов. Така че технически, всъщност не добавих нищо – просто замених целия масив с друг.
Същата концепция се прилага, ако масивът е в обект:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Резултат:
{"scores":[1,2,3,4]}
Ако трябва да работите с масиви, опитайте функции като json_set()
, json_insert()
, json_remove()
и json_replace()
вместо това.
Заменете обект с масив
Можем да заменим обекти с масив, като просто предоставим масив като корекция:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Резултат:
["Fluffy",10]
Заменете масив с обект
И работи и обратното:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Резултат:
{"name":"Fluffy","age":10}