Il json_replace()
di SQLite La funzione ci consente di sostituire un valore esistente in un documento JSON con un altro valore.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito dal percorso del valore da sostituire, seguito dal valore da sostituire.
Se necessario, possiamo anche sostituire più coppie chiave/valore.
Sintassi
Funziona così:
json_replace(json, path1, value1, path2, value2...)
Dove json
rappresenta il JSON originale e path1, value1, path2, value2...
sono coppie percorso/valore da sostituire.
Esempio
Ecco un esempio di base da dimostrare:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
Risultato:
{"name":"Baldy"}
Qui ho aggiornato il valore del name
chiave da Fluffy
a Baldy
.
Possiamo aggiornare più coppie chiave/valore in questo modo:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
Risultato:
{"name":"Baldy","age":11}
Ho semplicemente aggiunto più argomenti chiave/valore quando ho chiamato json_replace()
.
Qui, ho usato le interruzioni di riga per rendere il codice più facile da leggere. Avrebbe potuto essere tutto su una riga:il risultato sarebbe stato lo stesso.
E se la chiave non esiste?
Se la chiave non esiste già nel JSON, non viene sostituito nulla:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
Risultato:
{"name":"Fluffy"}
Questa è la caratteristica principale che contraddistingue il json_replace()
funzione da json_set()
e json_insert()
funzioni. Tali funzioni inseriranno il valore se la chiave non esiste già.
Tuttavia, è possibile inserire in modo efficace nuove chiavi con json_replace()
sostituendo l'intero oggetto/documento JSON. Esempio sotto.
Sostituisci l'intero documento JSON
Possiamo usare json_replace()
per sostituire l'intero documento JSON con un altro:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
Risultato:
{"name":"Baldy"}
Quindi questo ci consente di inserire efficacemente nuove chiavi nel documento:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
Risultato:
{"name":"Baldy","age":11}
A rigor di termini, non abbiamo inserito nuove chiavi. Abbiamo semplicemente sostituito l'intero documento. Ma il risultato è stato un documento JSON che contiene chiavi che l'originale non conteneva.
Sostituisci un oggetto incorporato
Possiamo anche sostituire gli oggetti incorporati:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
Risultato:
{"a":1,"b":{"c":2}}
Quando l'ho fatto, ho usato json()
funzione per restituire il mio argomento come stringa JSON. Ecco cosa succede quando non lo faccio:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
Risultato:
{"a":1,"b":"{ \"c\" : 2 }"}
Il documento JSON viene inserito come valore di testo invece di un oggetto JSON e le sue virgolette doppie vengono quindi salvate con barre inverse.
Tuttavia, non possiamo semplicemente rimuovere le virgolette singole, perché ciò provoca un errore:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
Risultato:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
Senza virgolette singole o json()
funzione, otteniamo un errore non appena incontra la parentesi graffa sinistra. Abbiamo quindi bisogno di usare virgolette singole o json()
funzione, a seconda che stiamo inserendo un oggetto JSON o un valore di stringa/testo SQL.
Un altro modo per inserire un oggetto JSON è utilizzare json_object()
funzione invece di json()
funzione:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
Risultato:
{"a":1,"b":{"c":2}}
Sostituisci un array
Lo stesso concetto si applica agli array:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
Risultato:
{"a":[5,6,7]}
Se rimuoviamo json()
funzione, otteniamo questo:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
Risultato:
{"a":"[ 5, 6, 7 ]"}
E se rimuoviamo le virgolette singole, otteniamo un errore:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
Risultato:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
In alternativa possiamo usare json_array()
funzione invece di json()
. Quella funzione ti consente di creare un array basato sui suoi argomenti:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
Risultato:
{"a":[5,6,7]}
Aggiungi valori alla fine di un array
Per aggiungere valori alla fine di un array, possiamo usare il json_insert()
o json_set()
funzioni.
Tuttavia, se dobbiamo usare json_replace()
, possiamo sostituire l'intero array con un altro che ha il/i valore/i extra aggiunto/i alla fine dell'array:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
Risultato:
[1,2,3,4]
Ma come accennato, json_insert()
e json_set()
consentono di aggiungere effettivamente valori all'array senza sostituire l'intero array.
Sostituisci gli elementi dell'array
Ecco un esempio di utilizzo di json_replace()
per sostituire un elemento all'interno di un array:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
Risultato:
[1,4,3]
Gli array sono a base zero, quindi [1]
indica il secondo elemento dell'array.
Il json_set()
la funzione può essere utilizzata anche per sostituire elementi esistenti. Tuttavia, il json_insert()
la funzione non ci consente di sostituire elementi esistenti.
Percorsi non validi
Riceveremo un errore se il nostro percorso non è ben formato:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
Risultato:
Runtime error: JSON path error near 'a'
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_replace('{ "a" : 1', '$.a', 2);
Risultato:
Runtime error: malformed JSON
Questa volta l'errore ci dice che il nostro JSON non è corretto.