En MariaDB, JSON_EXTRACT()
es una función integrada que extrae datos de un documento JSON, en función de una ruta o rutas determinadas.
Puede devolver valores únicos y valores múltiples. Si coincide un solo valor, se devuelve un solo valor. Si coinciden varios valores, esos valores se devuelven en una matriz.
Sintaxis
La sintaxis es así:
JSON_EXTRACT(json_doc, path[, path] ...)
Donde json_doc
es el documento JSON, y cada path
argumento es una ruta dentro del documento.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Resultado:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Vías Múltiples
Aquí hay un ejemplo de cómo especificar múltiples rutas para devolver múltiples valores del documento JSON.
Cuando devuelve varios valores, se devuelven en una 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] | +----------------------------------------------------+
Rutas inexistentes
Pasar una ruta que no existe en el documento JSON da como resultado NULL
.
Ejemplo:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Resultado:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Sin embargo, si se pasan varias rutas y al menos una de ellas coincide, el valor coincidente se extrae y se devuelve en una matriz. Esto es cierto incluso si solo se extrae un valor.
Ejemplo:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Resultado:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Arreglos
Aquí hay un ejemplo de cómo extraer datos de una 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" | +---------------------------------------------+
Las matrices están basadas en cero, por lo que $.awards[0]
extrae el primer elemento de los awards
matriz.
Objetos anidados
Aquí hay un ejemplo de cómo extraer datos de un objeto anidado dentro de otro 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" | +---------------+
Sin embargo, si quisiéramos extraer todos los premios, podríamos acortar la ruta a $.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"} | +---------------------------------------------------------------------------------------------------+
Embellece el resultado
Podemos hacer que el resultado sea más fácil de leer pasando JSON_EXTRACT()
al JSON_DETAILED()
función:
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
Si algún argumento es NULL
, el resultado es NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Resultado:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Recuento de parámetros incorrecto
No proporcionar argumentos da como resultado un error:
SELECT JSON_EXTRACT();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Es lo mismo cuando proporciona muy pocos o demasiados argumentos:
SELECT JSON_EXTRACT('{ "a": 1}');
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'