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 е неправилно оформен.