Possiamo usare SQLite json_remove()
funzione per rimuovere uno o più elementi da un oggetto o una matrice JSON.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito da uno o più percorsi che specificano quali elementi rimuovere. Per "elementi", intendo elementi di matrice o membri di oggetti (coppie chiave/valore).
Sintassi
La sintassi è questa:
json_remove(X,P,...)
Dove X
rappresenta il JSON originale e P,...
rappresenta il/i percorso/i da eliminare.
Esempio
Ecco un esempio da dimostrare:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Risultato:
{"name":"Fluffy"}
Qui, abbiamo specificato il $.age
percorso, ed è ciò che è stato rimosso dal documento JSON.
Rimuovi più membri
Possiamo rimuovere più membri da un oggetto JSON specificando più percorsi, separati da una virgola:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Risultato:
{"name":"Fluffy"}
Array
Possiamo rimuovere gli elementi dell'array specificando l'indice dell'elemento:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Risultato:
[0,1,3]
Gli array sono a base zero, quindi il conteggio inizia da 0
.
Tuttavia, è importante essere consapevoli dell'ordine in cui vengono effettuate le rimozioni. Le rimozioni avvengono in sequenza da sinistra a destra. Le modifiche causate da rimozioni precedenti possono influire sulla ricerca del percorso per gli argomenti successivi.
Ecco un esempio di come ciò può influenzare il nostro risultato:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Risultato:
[1,2]
In questo caso, elemento dell'array 0
è stato eliminato prima, quindi l'elemento dell'array 2
è stato eliminato dall'array rimanente. In altre parole, il secondo percorso ha rimosso l'elemento dall'array dopo che il primo percorso era già stato rimosso.
L'array risultante è uno che potremmo non aver previsto. Invece di rimuovere gli elementi 0
e 2
dall'array originale, abbiamo rimosso gli elementi 0
e 3
dall'array originale.
Possiamo superare questo problema riordinando i percorsi:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Risultato:
[1,3]
Nessun percorso
Gli argomenti del percorso sono in realtà facoltativi. Se chiamiamo json_remove()
senza argomenti di percorso, restituisce una versione ridotta del JSON di input (ovvero con lo spazio bianco in eccesso rimosso):
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Risultato:
{"name":"Fluffy","type":"Cat","age":10}
Questo è lo stesso risultato che otterremmo se usassimo json()
funzione invece di json_remove()
.
Percorso inesistente
La specifica di un percorso che non esiste nel JSON di input comporta la restituzione del JSON originale, invariato:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Risultato:
{"name":"Fluffy","age":10}
Percorsi non validi
Riceveremo un errore se il nostro percorso non è ben formato:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Risultato:
Runtime error: JSON path error near 'age'
In questo caso, ho dimenticato di includere $.
all'inizio del sentiero.
Documenti JSON non validi
Riceveremo anche un errore che JSON non è ben formato:
SELECT json_remove('{ "name" : "Fluffy", "age" }', '$.age');
Risultato:
Runtime error: malformed JSON
Questa volta l'errore ci dice che il nostro JSON non è corretto.