Vi kan bruge SQLite json_remove()
funktion til at fjerne et eller flere elementer fra et JSON-objekt eller et array.
Vi sender den originale JSON som det første argument, når vi kalder funktionen, efterfulgt af en eller flere stier, der specificerer, hvilke elementer der skal fjernes. Med "elementer" mener jeg enten matrixelementer eller objektmedlemmer (nøgle/værdi-par).
Syntaks
Syntaksen ser sådan ud:
json_remove(X,P,...)
Hvor X
repræsenterer den originale JSON og P,...
repræsenterer stien/stierne, der skal slettes.
Eksempel
Her er et eksempel til demonstration:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Resultat:
{"name":"Fluffy"}
Her specificerede vi $.age
sti, og det er det, der blev fjernet fra JSON-dokumentet.
Fjern flere medlemmer
Vi kan fjerne flere medlemmer fra et JSON-objekt ved at angive flere stier, adskilt af et komma:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Resultat:
{"name":"Fluffy"}
Arrays
Vi kan fjerne array-elementer ved at angive elementets indeks:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Resultat:
[0,1,3]
Arrays er nul-baserede, og derfor starter optællingen fra 0
.
Det er dog vigtigt at være opmærksom på den rækkefølge, som fjernelserne foretages i. Fjernelser sker sekventielt fra venstre mod højre. Ændringer forårsaget af tidligere fjernelser kan påvirke stisøgningen efter efterfølgende argumenter.
Her er et eksempel på, hvordan det kan påvirke vores resultat:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Resultat:
[1,2]
I dette tilfælde array-elementet 0
blev slettet først, derefter array-elementet 2
blev slettet fra det resterende array. Med andre ord fjernede den anden sti elementet fra arrayet, efter at den første sti allerede var blevet fjernet.
Den resulterende matrix er en, som vi måske ikke havde forventet. I stedet for at fjerne elementerne 0
og 2
fra det originale array har vi fjernet elementerne 0
og 3
fra det originale array.
Vi kan løse dette problem ved at omarrangere stierne:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Resultat:
[1,3]
Ingen stier
Stiargumenterne er faktisk valgfrie. Hvis vi kalder json_remove()
uden sti-argumenter returnerer den en minificeret version af input-JSON (dvs. med overskydende mellemrum fjernet):
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Resultat:
{"name":"Fluffy","type":"Cat","age":10}
Dette er det samme resultat, som vi ville få, hvis vi brugte json()
funktion i stedet for json_remove()
.
Ikke-eksisterende sti
Angivelse af en sti, der ikke findes i input-JSON, resulterer i, at den originale JSON returneres uændret:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Resultat:
{"name":"Fluffy","age":10}
Ugyldige stier
Vi får en fejl, hvis vores vej ikke er veludformet:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Resultat:
Runtime error: JSON path error near 'age'
I dette tilfælde glemte jeg at inkludere $.
forrest på stien.
Ugyldige JSON-dokumenter
Vi får også en fejl, JSON er ikke veludformet:
SELECT json_remove('{ "name" : "Fluffy", "age" }', '$.age');
Resultat:
Runtime error: malformed JSON
Denne gang fortæller fejlen os, at vores JSON er forkert udformet.