SQLite json_insert()
funktionen låter oss infoga ett nytt värde i ett JSON-dokument.
Vi skickar den ursprungliga JSON som det första argumentet när vi anropar funktionen, följt av en sökväg som anger var det nya värdet ska infogas, följt av värdet som ska infogas.
Vi kan också infoga flera nyckel/värdepar om det behövs.
Syntax
Funktionen heter så här:
json_extract(json, path1, value1, path2, value2...)
Där json
representerar den ursprungliga JSON, och path1, value1, path2, value2...
är sökväg/värdepar som vi kan använda för att infoga nya värden i JSON-dokumentet.
Exempel
Här är ett grundläggande exempel att visa:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);
Resultat:
{"a":1,"b":2}
Här infogade jag ett nytt nyckel/värdepar ("b":2
) i JSON-dokumentet.
Vi kan infoga flera nyckel/värdepar så här:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Resultat:
{"a":1,"b":2,"c":3}
Jag lade helt enkelt till fler nyckel/värde-argument när jag anropade json_insert()
.
Nyckel/värde finns redan?
json_insert()
funktionen kommer inte att infoga värdet om nyckeln redan finns:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Resultat:
{"a":1}
I det här fallet, nyckeln a
finns redan i JSON, så att försöka infoga ett nytt värde för den nyckeln fungerar inte.
För att ersätta ett värde, använd antingen json_replace()
eller json_set()
.
Infoga ett objekt
Här är ett exempel på hur du infogar ett annat JSON-dokument:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Resultat:
{"a":1,"b":{"c":2}}
I det här fallet använde jag json()
funktion för att returnera mitt argument som en JSON-sträng. Det här är vad som händer när jag inte gör det:
SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Resultat:
{"a":1,"b":"{ \"c\" : 2 }"}
JSON-dokumentet infogas som ett textvärde istället för ett JSON-objekt, och dess dubbla citattecken escapes därför med omvänt snedstreck.
Detta är rättvist dock. När allt kommer omkring lade vi det nya värdet i enstaka citattecken. Hur kunde SQLite veta om vi ville infoga en sträng eller ett JSON-objekt?
Och det är inte som om vi helt enkelt kan ta bort dessa enstaka citat:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Resultat:
Parse error: unrecognized token: "{" SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Utan enkla citattecken eller json()
funktion, får vi ett fel så fort den stöter på det vänstra krulliga hängslet.
Ett annat sätt att infoga ett JSON-objekt är att använda json_object()
funktion istället för json()
funktion:
SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );
Resultat:
{"a":1,"b":{"c":2}}
Infoga en array
Det är en liknande sak när du infogar arrayer:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Resultat:
{"a":1,"b":[2,3,4]}
Om vi tar bort json()
funktion får vi detta:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Resultat:
{"a":1,"b":"[ 2, 3, 4 ]"}
Och om vi tar bort de enskilda citattecken får vi ett felmeddelande:
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 använda json_array()
funktion istället för json()
. Den funktionen låter dig skapa en array baserat på dess argument:
SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Resultat:
{"a":1,"b":[2,3,4]}
Lägg till värden i slutet av en array
Vi kan använda json_insert()
för att lägga till värden i slutet av en matris.
För att göra detta, använd ett arrayindex av [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Resultat:
[1,2,3,4]
Samma princip gäller för kapslade arrayer:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Resultat:
[1,["a","b","c"],3]
Ogiltiga sökvägar
Vi får ett felmeddelande om vår väg inte är väl utformad:
SELECT json_insert('{ "a" : 1 }', 'b', 2);
Resultat:
Runtime error: JSON path error near 'b'
I det här fallet glömde jag att inkludera $.
längst fram på stigen.
Ogiltiga JSON-dokument
Vi får också ett felmeddelande om att JSON inte är välformaterad:
SELECT json_insert('{ "a" : 1', '$.b', 2);
Resultat:
Runtime error: malformed JSON
Den här gången berättar felet att vår JSON är felaktig.