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.