SQLite json_set()
funktionen tillåter oss att infoga i eller ersätta ett 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/ersättas, följt av värdet som ska infogas/ersättas.
Vi kan även infoga/byta ut flera nyckel/värdepar om det behövs.
Syntax
Det fungerar så här:
json_set(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 (eller ersätta, allt efter omständigheterna).
Exempel
Här är ett grundläggande exempel att visa:
SELECT json_set('{ "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_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Resultat:
{"a":1,"b":2,"c":3}
Jag lade helt enkelt till fler nyckel-/värdeargument när jag anropade json_set()
.
Ersätt värden
Om nyckeln redan finns ersätts dess värde med det nya värdet:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);
Resultat:
{"a":1,"b":3}
Detta är huvudskillnaden mellan json_set()
och json_insert()
. json_insert()
funktionen kommer inte att infoga värdet om nyckeln redan finns.
Ett annat sätt att ersätta värden är att använda json_replace()
.
Infoga ett objekt
Här är ett exempel på att infoga ett JSON-objekt:
SELECT json_set('{ "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_set('{ "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.
Att bara ta bort de enskilda citattecken resulterar dock i ett fel:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
Resultat:
Parse error: unrecognized token: "{" SELECT json_set('{ "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_set('{ "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_set('{ "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_set('{ "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_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 använda json_array()
funktion istället för json()
. Den funktionen låter dig skapa en array baserat på dess argument:
SELECT json_set('{ "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_set()
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_set('[ 1, 2, 3 ]', '$[#]', 4 );
Resultat:
[1,2,3,4]
Samma princip gäller för kapslade arrayer:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Resultat:
[1,["a","b","c"],3]
Ersätt matriselement
Vi kan använda json_set()
för att ersätta element i arrayen:
SELECT json_set('[ 1, 2, 3 ]', '$[1]', 4 );
Resultat:
[1,4,3]
Arrayer är nollbaserade, och så [1]
indikerar det andra matrisobjektet.
json_replace()
funktion kan också användas för att ersätta befintliga element. Återigen, detta skiljer sig från json_insert()
, som inte ersätter befintliga element.
Ogiltiga sökvägar
Vi får ett felmeddelande om vår väg inte är väl utformad:
SELECT json_set('{ "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_set('{ "a" : 1', '$.b', 2);
Resultat:
Runtime error: malformed JSON
Den här gången berättar felet att vår JSON är felaktig.