SQLite json_insert()
funktion giver os mulighed for at indsætte en ny 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, efterfulgt af værdien, der skal indsættes.
Vi kan også indsætte flere nøgle/værdi-par, hvis det kræves.
Syntaks
Funktionen hedder sådan her:
json_extract(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.
Eksempel
Her er et grundlæggende eksempel for at demonstrere:
SELECT json_insert('{ "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_insert('{ "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_insert()
.
Nøgle/værdi findes allerede?
json_insert()
Funktionen indsætter ikke værdien, hvis nøglen allerede findes:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Resultat:
{"a":1}
I dette tilfælde er nøglen a
eksisterer allerede i JSON, og derfor virker det ikke at forsøge at indsætte en ny værdi for den nøgle.
For at erstatte en værdi, brug enten json_replace()
eller json_set()
.
Indsæt et objekt
Her er et eksempel på indsættelse af et andet JSON-dokument:
SELECT json_insert('{ "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_insert('{ "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.
Dette er dog fair nok. Vi har jo sat den nye værdi i enkelte anførselstegn. Hvordan kunne SQLite vide, om vi ville indsætte en streng eller et JSON-objekt?
Og det er ikke sådan, at vi bare kan fjerne de enkelte citater:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Resultat:
Parse error: unrecognized token: "{" SELECT json_insert('{ "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_insert('{ "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_insert('{ "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_insert('{ "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_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Resultat:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "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_insert('{ "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_insert()
at tilføje værdier til slutningen af et array.
For at gøre dette skal du bruge et array-indeks på [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Resultat:
[1,2,3,4]
Det samme princip gælder for indlejrede arrays:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Resultat:
[1,["a","b","c"],3]
Ugyldige stier
Vi får en fejl, hvis vores vej ikke er veludformet:
SELECT json_insert('{ "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_insert('{ "a" : 1', '$.b', 2);
Resultat:
Runtime error: malformed JSON
Denne gang fortæller fejlen os, at vores JSON er forkert udformet.