В MariaDB, JSON_EXTRACT()
е вградена функция, която извлича данни от JSON документ въз основа на даден път или пътеки.
Може да връща единични стойности и множество стойности. Ако съвпадне една стойност, се връща една стойност. Ако съвпаднат няколко стойности, тогава тези стойности се връщат в масив.
Синтаксис
Синтаксисът е така:
JSON_EXTRACT(json_doc, path[, path] ...)
Където json_doc
е JSON документът и всеки path
аргументът е път в документа.
Пример
Ето пример за демонстрация.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Резултат:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Множество пътища
Ето пример за посочване на множество пътища, за да се върнат множество стойности от JSON документа.
Когато върнете няколко стойности, те се връщат в масив.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Резултат:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Несъществуващи пътища
Предаването на път, който не съществува в JSON документа, води до NULL
.
Пример:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Резултат:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Ако обаче са предадени множество пътища и поне един от тях съвпада, тогава съответстващата стойност се извлича и връща в масив. Това е вярно дори ако е извлечена само една стойност.
Пример:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Резултат:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Масиви
Ето пример за извличане на данни от масив:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Резултат:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Масивите са базирани на нула и така $.awards[0]
извлича първия елемент от 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.New York Marathon'
) AS Result;
Резултат:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Ако обаче искаме да извлечем всички награди, бихме могли да съкратим пътя до $.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;
Резултат:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Украсете резултата
Можем да направим резултата по-лесен за четене, като предадем JSON_EXTRACT()
към JSON_DETAILED()
функция:
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;
Резултат:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Нулеви аргументи
Ако някой аргумент е NULL
, резултатът е NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Резултат:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Неправилен брой параметри
Предоставянето на без аргументи води до грешка:
SELECT JSON_EXTRACT();
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Същото е, когато предоставите твърде малко или твърде много аргументи:
SELECT JSON_EXTRACT('{ "a": 1}');
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'