I SQLite, json_patch()
funktionen kan användas för att lägga till, ändra eller ta bort element i ett JSON-objekt.
För att göra detta kör den RFC-7396 MergePatch-algoritmen för att applicera en given patch mot den givna JSON-ingången.
Vi skickar den ursprungliga JSON som det första argumentet när vi anropar funktionen, följt av patchen. Funktionen tillämpar sedan den patchen mot JSON i det första argumentet.
Syntax
Syntaxen ser ut så här:
json_patch(T,P)
Där T
representerar den ursprungliga JSON och P
är plåstret. Funktionen tillämpar patch P
mot T
.
Innehållet i den medföljande patchen P
jämförs med det aktuella innehållet i JSON-måldokumentet T
. Om P
innehåller medlemmar som inte förekommer i T
, läggs dessa medlemmar till. Om T
innehåller medlemmen, ersätts värdet.
Nullvärden i P
ges speciell betydelse för att indikera borttagandet av befintliga värden i T
.
Exempel
Här är några exempel att visa.
Infoga
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Resultat:
{"name":"Fluffy","age":10}
Att försöka infoga en ny medlem med ett nullvärde fungerar inte:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Resultat:
{"name":"Fluffy"}
Nullvärden används faktiskt för att ta bort medlemmar från JSON (som ses i ett senare exempel).
Uppdatera
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Resultat:
{"name":"Baldy"}
Om det finns flera nyckel-/värdepar, men vi bara vill uppdatera ett, behöver vi bara ange det i vårt andra argument:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Resultat:
{"name":"Baldy","age":10}
Samma koncept gäller när du uppdaterar flera nyckel-/värdepar – vi behöver bara ange dessa:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Resultat:
{"name":"Baldy","type":"Cat","age":11}
Uppdatera och infoga
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Resultat:
{"name":"Baldy","age":10}
Ta bort/ta bort
Nullvärden i sammanslagningskorrigeringen ges speciell betydelse för att indikera borttagandet av befintliga värden i målet:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Resultat:
{"name":"Fluffy"}
Arrayer
json_patch()
Funktionen kan inte lägga till element i en array eller modifiera enskilda element i en array. Den kan bara infoga, ersätta eller ta bort hela arrayen som en enda enhet.
Så här är ett exempel på att lägga till ett element till en array:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Resultat:
[1,2,3,4]
Jag var tvungen att ersätta den ursprungliga arrayen med en helt ny. Så tekniskt sett har jag faktiskt inte lagt till någonting – jag ersatte helt enkelt hela arrayen med en annan.
Samma koncept gäller om arrayen är inom ett objekt:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Resultat:
{"scores":[1,2,3,4]}
Om du behöver arbeta med arrayer, prova funktioner som json_set()
, json_insert()
, json_remove()
och json_replace()
istället.
Ersätt ett objekt med en array
Vi kan ersätta objekt med en array genom att helt enkelt tillhandahålla en array som patch:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Resultat:
["Fluffy",10]
Ersätt en array med ett objekt
Och det fungerar tvärtom också:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Resultat:
{"name":"Fluffy","age":10}