I MariaDB, JSON_EXTRACT()
er en indbygget funktion, der udtrækker data fra et JSON-dokument, baseret på en given sti eller stier.
Det kan returnere enkelte værdier og flere værdier. Hvis en enkelt værdi matches, returneres en enkelt værdi. Hvis flere værdier matches, returneres disse værdier i en matrix.
Syntaks
Syntaksen ser sådan ud:
JSON_EXTRACT(json_doc, path[, path] ...)
Hvor json_doc
er JSON-dokumentet og hver path
argument er en sti i dokumentet.
Eksempel
Her er et eksempel til at demonstrere.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Resultat:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Flere stier
Her er et eksempel på at angive flere stier for at returnere flere værdier fra JSON-dokumentet.
Når du returnerer flere værdier, returneres de i en matrix.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Resultat:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Ikke-eksisterende stier
At sende en sti, der ikke findes i JSON-dokumentet, resulterer i NULL
.
Eksempel:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Resultat:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Men hvis flere stier passeres, og mindst én af dem matcher, udtrækkes den matchende værdi og returneres i et array. Dette gælder, selvom kun én værdi er udtrukket.
Eksempel:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Resultat:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Arrays
Her er et eksempel på udtrækning af data fra et array:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Resultat:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Arrays er nul-baserede, og derfor $.awards[0]
udtrækker det første element af awards
array.
Indlejrede objekter
Her er et eksempel på udtrækning af data fra et objekt indlejret i et andet objekt:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards.New York Marathon'
) AS Result;
Resultat:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Men hvis vi ville udtrække alle priser, kunne vi forkorte stien til $.details.awards
:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards'
) AS Result;
Resultat:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Fremstil resultatet
Vi kan gøre resultatet lettere at læse ved at sende JSON_EXTRACT()
til JSON_DETAILED()
funktion:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_EXTRACT(
@json_document,
'$.details.awards'
)
) AS Result;
Resultat:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Nul-argumenter
Hvis et argument er NULL
, resultatet er NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Resultat:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Forkert parameterantal
Angivelse af ingen argumenter resulterer i en fejl:
SELECT JSON_EXTRACT();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Det er det samme, når du giver for få eller for mange argumenter:
SELECT JSON_EXTRACT('{ "a": 1}');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'