W SQLite json_patch()
funkcja może być używana do dodawania, modyfikowania lub usuwania elementów obiektu JSON.
Aby to zrobić, uruchamia algorytm MergePatch RFC-7396, aby zastosować daną poprawkę do danych wejściowych JSON.
Podczas wywoływania funkcji przekazujemy oryginalny JSON jako pierwszy argument, po którym następuje łatka. Funkcja następnie stosuje tę poprawkę do JSON w pierwszym argumencie.
Składnia
Składnia wygląda tak:
json_patch(T,P)
Gdzie T
reprezentuje oryginalny JSON, a P
jest łatka. Funkcja stosuje łatkę P
przeciwko T
.
Zawartość dostarczonej łatki P
jest porównywany z bieżącą zawartością docelowego dokumentu JSON T
. Jeśli P
zawiera członków, którzy nie pojawiają się w T
, ci członkowie są dodawani. Jeśli T
zawiera członka, wartość jest zastępowana.
Wartości null w P
mają specjalne znaczenie, aby wskazać usunięcie istniejących wartości w T
.
Przykłady
Oto kilka przykładów do zademonstrowania.
Wstaw
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Wynik:
{"name":"Fluffy","age":10}
Próba wstawienia nowego członka z wartością null nie działa:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Wynik:
{"name":"Fluffy"}
Wartości null są w rzeczywistości używane do usuwania członków z JSON (jak widać w późniejszym przykładzie).
Aktualizacja
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Wynik:
{"name":"Baldy"}
Jeśli istnieje wiele par klucz/wartość, ale chcemy zaktualizować tylko jedną, wystarczy określić tę jedną w naszym drugim argumencie:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Wynik:
{"name":"Baldy","age":10}
Ta sama koncepcja dotyczy aktualizacji wielu par klucz/wartość – musimy tylko określić te pary:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Wynik:
{"name":"Baldy","type":"Cat","age":11}
Aktualizuj i wstaw
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Wynik:
{"name":"Baldy","age":10}
Usuń/Usuń
Wartości null w łatce scalającej mają specjalne znaczenie, aby wskazać usunięcie istniejących wartości w celu:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Wynik:
{"name":"Fluffy"}
Tablice
json_patch()
Funkcja nie może dołączać elementów do tablicy ani modyfikować poszczególnych elementów tablicy. Może tylko wstawiać, zastępować lub usuwać całą tablicę jako pojedynczą jednostkę.
Oto przykład dołączenia elementu do tablicy:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Wynik:
[1,2,3,4]
Musiałem wymienić oryginalną tablicę na zupełnie nową. Więc technicznie rzecz biorąc, właściwie niczego nie dodałem – po prostu wymieniłem całą tablicę na inną.
Ta sama koncepcja ma zastosowanie, jeśli tablica znajduje się w obiekcie:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Wynik:
{"scores":[1,2,3,4]}
Jeśli potrzebujesz pracować z tablicami, wypróbuj funkcje takie jak json_set()
, json_insert()
, json_remove()
i json_replace()
zamiast tego.
Zamień obiekt na tablicę
Możemy zastąpić obiekty tablicą, po prostu dostarczając tablicę jako łatkę:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Wynik:
["Fluffy",10]
Zamień tablicę na obiekt
Działa to też w drugą stronę:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Wynik:
{"name":"Fluffy","age":10}