SQLite json_set() funktion giver os mulighed for at indsætte i eller erstatte en værdi i et JSON-dokument.
Vi sender den originale JSON som det første argument, når vi kalder funktionen, efterfulgt af en sti, der specificerer, hvor den nye værdi skal indsættes/erstattes, efterfulgt af værdien, der skal indsættes/erstattes.
Vi kan også indsætte/erstatte flere nøgle/værdi-par, hvis det kræves.
Syntaks
Det fungerer sådan her:
json_set(json, path1, value1, path2, value2...)
Hvor json repræsenterer den originale JSON og path1, value1, path2, value2... er sti/værdi-par, som vi kan bruge til at indsætte nye værdier i JSON-dokumentet (eller erstatte alt efter tilfældet).
Eksempel
Her er et grundlæggende eksempel for at demonstrere:
SELECT json_set('{ "a" : 1 }', '$.b', 2); Resultat:
{"a":1,"b":2}
Her indsatte jeg et nyt nøgle/værdi-par ("b":2 ) ind i JSON-dokumentet.
Vi kan indsætte flere nøgle/værdi-par som dette:
SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 ); Resultat:
{"a":1,"b":2,"c":3}
Jeg tilføjede simpelthen flere nøgle/værdi-argumenter, da jeg kaldte json_set() .
Erstat værdier
Hvis nøglen allerede eksisterer, erstattes dens værdi med den nye værdi:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3); Resultat:
{"a":1,"b":3}
Dette er hovedforskellen mellem json_set() og json_insert() . json_insert() Funktionen indsætter ikke værdien, hvis nøglen allerede findes.
En anden måde at erstatte værdier på er at bruge json_replace() .
Indsæt et objekt
Her er et eksempel på indsættelse af et JSON-objekt:
SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') ); Resultat:
{"a":1,"b":{"c":2}}
I dette tilfælde brugte jeg json() funktion for at returnere mit argument som en JSON-streng. Her er, hvad der sker, når jeg ikke gør det:
SELECT json_set('{ "a" : 1 }', '$.b', '{ "c" : 2 }' ); Resultat:
{"a":1,"b":"{ \"c\" : 2 }"} JSON-dokumentet indsættes som en tekstværdi i stedet for et JSON-objekt, og dets dobbelte anførselstegn undgås derfor med omvendte skråstreg.
Men blot at fjerne de enkelte anførselstegn resulterer i en fejl:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } ); Resultat:
Parse error: unrecognized token: "{"
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
error here ---^
Uden enkelte anførselstegn eller json() funktion, får vi en fejl, så snart den støder på den venstre krøllede bøjle.
En anden måde at indsætte et JSON-objekt på er at bruge json_object() funktion i stedet for json() funktion:
SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) ); Resultat:
{"a":1,"b":{"c":2}} Indsæt et array
Det er en lignende ting, når du indsætter arrays:
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]')); Resultat:
{"a":1,"b":[2,3,4]}
Hvis vi fjerner json() funktion, får vi dette:
SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]'); Resultat:
{"a":1,"b":"[ 2, 3, 4 ]"} Og hvis vi fjerner de enkelte anførselstegn, får vi en fejlmeddelelse:
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); Resultat:
Parse error: no such column: 2, 3, 4
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
error here ---^
Vi kan alternativt bruge json_array() funktion i stedet for json() . Denne funktion giver dig mulighed for at oprette et array baseret på dets argumenter:
SELECT json_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) ); Resultat:
{"a":1,"b":[2,3,4]} Tilføj værdier til slutningen af et array
Vi kan bruge json_set() at tilføje værdier til slutningen af et array.
For at gøre dette skal du bruge et array-indeks på [#] :
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 ); Resultat:
[1,2,3,4]
Det samme princip gælder for indlejrede arrays:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" ); Resultat:
[1,["a","b","c"],3]
Erstat array-elementer
Vi kan bruge json_set() for at erstatte elementer i arrayet:
SELECT json_set('[ 1, 2, 3 ]', '$[1]', 4 ); Resultat:
[1,4,3]
Arrays er nul-baserede, og så [1] angiver det andet array-element.
json_replace() funktion kan også bruges til at erstatte eksisterende elementer. Igen, dette er anderledes end json_insert() , som ikke erstatter eksisterende elementer.
Ugyldige stier
Vi får en fejl, hvis vores vej ikke er veludformet:
SELECT json_set('{ "a" : 1 }', 'b', 2); Resultat:
Runtime error: JSON path error near 'b'
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_set('{ "a" : 1', '$.b', 2); Resultat:
Runtime error: malformed JSON
Denne gang fortæller fejlen os, at vores JSON er forkert udformet.