Il json_set() di SQLite La funzione ci consente di inserire o sostituire un valore in un documento JSON.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito da un percorso che specifica dove inserire/sostituire il nuovo valore, seguito dal valore da inserire/sostituire.
Possiamo anche inserire/sostituire più coppie chiave/valore, se necessario.
Sintassi
Funziona così:
json_set(json, path1, value1, path2, value2...)
Dove json rappresenta il JSON originale e path1, value1, path2, value2... sono coppie percorso/valore che possiamo utilizzare per inserire nuovi valori nel documento JSON (o sostituire, a seconda dei casi).
Esempio
Ecco un esempio di base da dimostrare:
SELECT json_set('{ "a" : 1 }', '$.b', 2); Risultato:
{"a":1,"b":2}
Qui ho inserito una nuova coppia chiave/valore ("b":2 ) nel documento JSON.
Possiamo inserire più coppie chiave/valore come questa:
SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 ); Risultato:
{"a":1,"b":2,"c":3}
Ho semplicemente aggiunto più argomenti chiave/valore quando ho chiamato json_set() .
Sostituisci valori
Se la chiave esiste già, il suo valore viene sostituito con il nuovo valore:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3); Risultato:
{"a":1,"b":3}
Questa è la differenza principale tra json_set() e json_insert() . Il json_insert() la funzione non inserirà il valore se la chiave esiste già.
Un altro modo per sostituire i valori è usare json_replace() .
Inserisci un oggetto
Ecco un esempio di inserimento di un oggetto JSON:
SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') ); Risultato:
{"a":1,"b":{"c":2}}
In questo caso, ho usato json() funzione per restituire il mio argomento come stringa JSON. Ecco cosa succede quando non lo faccio:
SELECT json_set('{ "a" : 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, la semplice rimozione delle virgolette singole genera un errore:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } ); Risultato:
Parse error: unrecognized token: "{"
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
error here ---^
Senza virgolette singole o json() funzione, riceviamo un errore non appena incontra la parentesi graffa sinistra.
Un altro modo per inserire un oggetto JSON è utilizzare json_object() funzione invece di json() funzione:
SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) ); Risultato:
{"a":1,"b":{"c":2}} Inserisci un array
È una cosa simile quando si inseriscono gli array:
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]')); Risultato:
{"a":1,"b":[2,3,4]}
Se rimuoviamo json() funzione, otteniamo questo:
SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]'); Risultato:
{"a":1,"b":"[ 2, 3, 4 ]"} E se rimuoviamo le virgolette singole, otteniamo un errore:
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); Risultato:
Parse error: no such column: 2, 3, 4
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
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_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) ); Risultato:
{"a":1,"b":[2,3,4]} Aggiungi valori alla fine di un array
Possiamo usare json_set() per aggiungere valori alla fine di un array.
Per fare ciò, usa un indice di matrice di [#] :
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 ); Risultato:
[1,2,3,4]
Lo stesso principio si applica agli array nidificati:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" ); Risultato:
[1,["a","b","c"],3]
Sostituisci gli elementi dell'array
Possiamo usare json_set() per sostituire gli elementi nell'array:
SELECT json_set('[ 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_replace() la funzione può essere utilizzata anche per sostituire elementi esistenti. Di nuovo, questo è diverso da json_insert() , che non sostituisce gli elementi esistenti.
Percorsi non validi
Riceveremo un errore se il nostro percorso non è ben formato:
SELECT json_set('{ "a" : 1 }', 'b', 2); Risultato:
Runtime error: JSON path error near 'b'
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_set('{ "a" : 1', '$.b', 2); Risultato:
Runtime error: malformed JSON
Questa volta l'errore ci dice che il nostro JSON non è corretto.