V MariaDB, JSON_EXTRACT()
je vestavěná funkce, která extrahuje data z dokumentu JSON na základě dané cesty nebo cest.
Může vrátit jednotlivé hodnoty a více hodnot. Pokud je jedna hodnota shodná, je vrácena jedna hodnota. Pokud se shoduje více hodnot, pak jsou tyto hodnoty vráceny v poli.
Syntaxe
Syntaxe vypadá takto:
JSON_EXTRACT(json_doc, path[, path] ...)
Kde json_doc
je dokument JSON a každá path
argument je cesta v dokumentu.
Příklad
Zde je příklad k demonstraci.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Výsledek:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Více cest
Zde je příklad zadání více cest za účelem vrácení více hodnot z dokumentu JSON.
Když vrátíte více hodnot, budou vráceny v poli.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Výsledek:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Neexistující cesty
Předání cesty, která v dokumentu JSON neexistuje, má za následek NULL
.
Příklad:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Výsledek:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Pokud je však předáno více cest a alespoň jedna z nich se shoduje, je shodná hodnota extrahována a vrácena v poli. To platí, i když je extrahována pouze jedna hodnota.
Příklad:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Výsledek:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Pole
Zde je příklad extrahování dat z pole:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Výsledek:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Pole jsou založeny na nule, a proto $.awards[0]
extrahuje první prvek z awards
pole.
Vnořené objekty
Zde je příklad extrahování dat z objektu vnořeného do jiného objektu:
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;
Výsledek:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Pokud bychom však chtěli získat všechna ocenění, mohli bychom zkrátit cestu k $.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;
Výsledek:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Zkrášlení výsledku
Výsledek můžeme usnadnit čtení předáním JSON_EXTRACT()
na JSON_DETAILED()
funkce:
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;
Výsledek:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Nulové argumenty
Pokud je některý argument NULL
, výsledkem je NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Výsledek:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Nesprávný počet parametrů
Pokud neposkytnete žádné argumenty, dojde k chybě:
SELECT JSON_EXTRACT();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Je to stejné, když poskytnete příliš málo nebo příliš mnoho argumentů:
SELECT JSON_EXTRACT('{ "a": 1}');
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'