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