I SQLite er json_patch()
funktionen kan bruges til at tilføje, ændre eller slette elementer i et JSON-objekt.
For at gøre dette kører den RFC-7396 MergePatch-algoritmen for at anvende en given patch mod det givne JSON-input.
Vi sender den originale JSON som det første argument, når vi kalder funktionen, efterfulgt af patchen. Funktionen anvender derefter denne patch mod JSON i det første argument.
Syntaks
Syntaksen ser sådan ud:
json_patch(T,P)
Hvor T
repræsenterer den originale JSON og P
er lappen. Funktionen anvender patch P
mod T
.
Indholdet af den medfølgende patch P
sammenlignes med det aktuelle indhold af JSON-måldokumentet T
. Hvis P
indeholder medlemmer, der ikke vises i T
, tilføjes disse medlemmer. Hvis T
indeholder medlemmet, erstattes værdien.
Nulværdier i P
gives særlig betydning for at angive fjernelse af eksisterende værdier i T
.
Eksempler
Her er nogle eksempler til demonstration.
Indsæt
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Resultat:
{"name":"Fluffy","age":10}
At forsøge at indsætte et nyt medlem med en nulværdi virker ikke:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Resultat:
{"name":"Fluffy"}
Null-værdier bruges faktisk til at fjerne medlemmer fra JSON (som vist i et senere eksempel).
Opdater
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Resultat:
{"name":"Baldy"}
Hvis der er flere nøgle/værdi-par, men vi kun ønsker at opdatere ét, behøver vi kun at angive det ene i vores andet argument:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Resultat:
{"name":"Baldy","age":10}
Det samme koncept gælder ved opdatering af flere nøgle/værdi-par – vi behøver kun at specificere disse:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Resultat:
{"name":"Baldy","type":"Cat","age":11}
Opdater og indsæt
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Resultat:
{"name":"Baldy","age":10}
Slet/fjern
Nulværdier i flettepatchen tildeles en særlig betydning for at angive fjernelse af eksisterende værdier i målet:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Resultat:
{"name":"Fluffy"}
Arrays
json_patch()
funktion kan ikke tilføje elementer til et array eller ændre individuelle elementer i et array. Den kan kun indsætte, erstatte eller slette hele arrayet som en enkelt enhed.
Så her er et eksempel på at tilføje et element til en matrix:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Resultat:
[1,2,3,4]
Jeg var nødt til at erstatte det originale array med et helt nyt. Så teknisk set har jeg faktisk ikke tilføjet noget – jeg erstattede simpelthen hele arrayet med et andet.
Det samme koncept gælder, hvis arrayet er inden for et objekt:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Resultat:
{"scores":[1,2,3,4]}
Hvis du har brug for at arbejde med arrays, prøv funktioner såsom json_set()
, json_insert()
, json_remove()
og json_replace()
i stedet.
Erstat et objekt med et array
Vi kan erstatte objekter med et array ved blot at levere et array som patch:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Resultat:
["Fluffy",10]
Erstat et array med et objekt
Og det fungerer også omvendt:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Resultat:
{"name":"Fluffy","age":10}