Cuando usamos SQLite, podemos usar los siguientes métodos para extraer datos de un documento JSON.
El json_extract()
Función
Como sugiere su nombre, el json_extract()
La función extrae y devuelve uno o más valores de JSON bien formado.
Ejemplo:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Resultado:
{"name":"Bark","scores":[3,4,8,7]}
Las matrices se basan en cero, por lo que el recuento comienza en 0
. Por lo tanto, especificamos [1]
para obtener el segundo elemento dentro de los dogs
matriz, que resulta ser un objeto JSON.
Podemos devolver solo el nombre del perro en esa posición en la matriz agregando a nuestra ruta:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
);
Resultado:
Bark
Podemos usar json_extract()
para devolver varias rutas:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);
Resultado:
["Wag","Bark","Woof"]
Cuando extraemos valores de varias rutas, los valores se devuelven en una matriz.
El ->
Operador
El ->
El operador extrae un subcomponente de un documento JSON y devuelve una representación JSON de ese subcomponente.
Por lo tanto, podemos cambiar el primer ejemplo a este:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]';
Resultado:
{"name":"Bark","scores":[3,4,8,7]}
El ->
El operador es sutilmente diferente al json_extract()
función:
- El
->
El operador siempre devuelve una representación JSON del subcomponente. - El
json_extract()
La función solo devuelve JSON si hay dos o más argumentos de ruta (porque el resultado es una matriz JSON) o si el argumento de ruta única hace referencia a una matriz u objeto. - Si solo hay un argumento de ruta y esa ruta hace referencia a un JSON nulo, una cadena o un valor numérico, entonces
json_extract()
devuelve el valor SQL NULL, TEXT, INTEGER o REAL correspondiente.
Por lo tanto, esto es lo que sucede cuando extraemos el nombre de un perro de nuestro JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name';
Resultado:
"Bark"
Esta vez está rodeado de comillas. Eso es porque devolvió una representación JSON del valor. Cuando extrajimos el mismo valor con json_extract()
anteriormente, obtuvimos una representación SQL del valor.
Sin embargo, también podemos usar el ->>
operador para devolver una representación SQL.
El ->>
Operador
El ->>
El operador funciona de la misma manera que el ->
operador, excepto que ->>
devuelve una representación SQL del subcomponente especificado. Específicamente, devuelve un SQL TEXT
, INTEGER
, REAL
o NULL
valor que representa el subcomponente seleccionado, o NULL
si el subcomponente no existe.
Por lo tanto, esto es lo que sucede cuando usamos ->>
operador para extraer el nombre del perro:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name';
Resultado:
Bark
Ya no está entre comillas.