I MariaDB, JSON_INSERT()
är en inbyggd funktion som infogar data i ett JSON-dokument och returnerar resultatet.
Syntax
Syntaxen ser ut så här:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Där json_doc
är JSON-dokumentet, path
är sökvägen för var data ska infogas och val
är värdet som ska infogas vid den sökvägen.
Exempel
Här är ett exempel att visa.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog");
Resultat:
+----------------------------------------------+ | JSON_INSERT(@json_document, '$.type', "Dog") | +----------------------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------------------+
Här infogade jag "type": "Dog"
in i dokumentet.
I det här fallet använde jag $.type
som vägen. Därför type
är nyckeln och Dog
är värdet.
När sökvägen redan finns
Att passera en sökväg som redan finns i JSON-dokumentet resulterar i att originaldokumentet returneras oförändrat.
Exempel:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");
Resultat:
+-----------------------------------------------+ | JSON_INSERT(@json_document, '$.name', "Bark") | +-----------------------------------------------+ | {"name": "Wag"} | +-----------------------------------------------+
Infoga matriser
Här är ett exempel på att infoga en array i ett JSON-dokument:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');
Resultat:
+--------------------------------------------------------+ | JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') | +--------------------------------------------------------+ | {"name": "Wag", "scores": "[ 8, 7, 9 ]"} | +--------------------------------------------------------+
Läggar till i arrayer
Här är ett exempel på hur du använder JSON_INSERT()
för att lägga till data till en array:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");
Resultat:
+--------------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") | +--------------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} | +--------------------------------------------------------------+
Men även om det fungerade bra för det här exemplet, kunde det lätt ha misslyckats. Om vi till exempel försöker infoga värdet på en annan plats i arrayen, fungerar det inte:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");
Resultat:
+-----------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") | +-----------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog"]} | +-----------------------------------------------------------+
För att infoga värden i en array, använd JSON_ARRAY_INSERT()
funktion istället.
Även om vi kunde lägga till ett värde till en array i exemplet ovan, är det förmodligen bättre för dig att använda JSON_ARRAY_APPEND()
funktion, eftersom den är utformad speciellt för det ändamålet.
Inkapslade objekt
Här är ett exempel på att infoga ett värde i ett objekt kapslat inuti ett annat objekt:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
);
Resultat:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}}
Förskön resultatet
Vi kan använda JSON_DETAILED()
funktion för att göra resultatet lättare att läsa:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
);
Resultat:
{ "_id": 1, "name": "Wag", "details": { "type": "Dog", "weight": 20, "awards": { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } } }
Nollargument
Om någon av json_document
eller path
argument är NULL
, resultatet är NULL
:
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog');
Resultat:
+------------------------------------+-------------------------------------+ | JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') | +------------------------------------+-------------------------------------+ | NULL | NULL | +------------------------------------+-------------------------------------+
Men om value
argumentet är NULL
, läggs nyckeln till vid den angivna sökvägen, med värdet null
:
SELECT JSON_INSERT('{"a":1}', '$.type', null);
Resultat:
+----------------------------------------+ | JSON_INSERT('{"a":1}', '$.type', null) | +----------------------------------------+ | {"a": 1, "type": null} | +----------------------------------------+
Felaktig parameterräkning
Att inte tillhandahålla några argument resulterar i ett fel:
SELECT JSON_INSERT();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Det är samma sak när du ger för få eller för många argument:
SELECT JSON_INSERT('{ "a": 1}');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Liknande funktioner
JSON_REPLACE()
funktion kan uppdatera befintliga data.
JSON_SET()
funktionen kan uppdatera befintliga data och infoga nya data. Alltså JSON_SET()
är som JSON_INSERT()
och JSON_REPLACE()
i en funktion.