No MariaDB,
JSON_EXTRACT()
é uma função interna que extrai dados de um documento JSON, com base em um determinado caminho ou caminhos. Ele pode retornar valores únicos e vários valores. Se um único valor for correspondido, um único valor será retornado. Se vários valores forem correspondidos, esses valores serão retornados em uma matriz.
Sintaxe
A sintaxe fica assim:
JSON_EXTRACT(json_doc, path[, path] ...)
Onde
json_doc
é o documento JSON e cada path
argumento é um caminho dentro do documento. Exemplo
Aqui está um exemplo para demonstrar.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Resultado:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Vários caminhos
Aqui está um exemplo de especificação de vários caminhos para retornar vários valores do documento JSON.
Quando você retorna vários valores, eles são retornados em uma matriz.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Resultado:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Caminhos inexistentes
Passar um caminho que não existe no documento JSON resulta em
NULL
. Exemplo:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Resultado:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
No entanto, se vários caminhos forem passados e pelo menos um deles corresponder, o valor correspondente será extraído e retornado em uma matriz. Isso é verdade mesmo se apenas um valor for extraído.
Exemplo:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Resultado:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Matrizes
Aqui está um exemplo de extração de dados de uma matriz:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Resultado:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
As matrizes são baseadas em zero e, portanto,
$.awards[0]
extrai o primeiro elemento dos awards
variedade. Objetos aninhados
Aqui está um exemplo de extração de dados de um objeto aninhado dentro de outro objeto:
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;
Resultado:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
No entanto, se quiséssemos extrair todos os prêmios, poderíamos encurtar o caminho para
$.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;
Resultado:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Embelezar o resultado
Podemos tornar o resultado mais fácil de ler passando
JSON_EXTRACT()
para o JSON_DETAILED()
função: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;
Resultado:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Argumentos nulos
Se algum argumento for
NULL
, o resultado é NULL
:SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Resultado:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Contagem de parâmetros incorreta
Não fornecer argumentos resulta em um erro:
SELECT JSON_EXTRACT();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
É o mesmo quando você fornece poucos ou muitos argumentos:
SELECT JSON_EXTRACT('{ "a": 1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'