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.