In SQLite, il json_patch()
La funzione può essere utilizzata per aggiungere, modificare o eliminare elementi di un oggetto JSON.
A tale scopo, esegue l'algoritmo RFC-7396 MergePatch per applicare una determinata patch all'input JSON specificato.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito dalla patch. La funzione applica quindi quella patch a JSON nel primo argomento.
Sintassi
La sintassi è questa:
json_patch(T,P)
Dove T
rappresenta il JSON originale e P
è la toppa. La funzione applica la patch P
contro T
.
Il contenuto della patch fornita P
viene confrontato con il contenuto corrente del documento JSON di destinazione T
. Se P
contiene membri che non compaiono in T
, quei membri vengono aggiunti. Se T
contiene il membro, il valore viene sostituito.
Valori nulli in P
hanno un significato speciale per indicare la rimozione dei valori esistenti in T
.
Esempi
Ecco alcuni esempi da dimostrare.
Inserisci
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Risultato:
{"name":"Fluffy","age":10}
Il tentativo di inserire un nuovo membro con un valore nullo non funziona:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Risultato:
{"name":"Fluffy"}
I valori Null vengono effettivamente utilizzati per rimuovere i membri dal JSON (come si vede in un esempio successivo).
Aggiorna
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Risultato:
{"name":"Baldy"}
Se ci sono più coppie chiave/valore, ma vogliamo aggiornarne solo una, dobbiamo solo specificarla nel nostro secondo argomento:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Risultato:
{"name":"Baldy","age":10}
Lo stesso concetto si applica quando si aggiornano più coppie chiave/valore:dobbiamo solo specificare quelle:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Risultato:
{"name":"Baldy","type":"Cat","age":11}
Aggiorna e inserisci
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Risultato:
{"name":"Baldy","age":10}
Elimina/Rimuovi
Ai valori Null nella patch di unione viene assegnato un significato speciale per indicare la rimozione dei valori esistenti nella destinazione:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Risultato:
{"name":"Fluffy"}
Array
Il json_patch()
La funzione non può aggiungere elementi a un array, né modificare i singoli elementi di un array. Può solo inserire, sostituire o eliminare l'intero array come una singola unità.
Quindi, ecco un esempio di aggiunta di un elemento a un array:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Risultato:
[1,2,3,4]
Ho dovuto sostituire l'array originale con uno completamente nuovo. Quindi, tecnicamente, in realtà non ho aggiunto nulla:ho semplicemente sostituito l'intero array con un altro.
Lo stesso concetto si applica se l'array si trova all'interno di un oggetto:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Risultato:
{"scores":[1,2,3,4]}
Se devi lavorare con gli array, prova funzioni come json_set()
, json_insert()
, json_remove()
e json_replace()
invece.
Sostituisci un oggetto con un array
Possiamo sostituire gli oggetti con un array semplicemente fornendo un array come patch:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Risultato:
["Fluffy",10]
Sostituisci un array con un oggetto
E funziona anche al contrario:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Risultato:
{"name":"Fluffy","age":10}