Ao usar o SQLite, podemos usar os seguintes métodos para extrair dados de um documento JSON.
O json_extract()
Função
Como o próprio nome sugere, o
json_extract()
A função extrai e retorna um ou mais valores de JSON bem formado. Exemplo:
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]}
As matrizes são baseadas em zero e, portanto, a contagem começa em
0
. Portanto, especificamos [1]
para obter o segundo elemento dentro do dogs
array, que por acaso é um objeto JSON. Podemos retornar apenas o nome do cachorro naquela posição no array adicionando ao nosso caminho:
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 retornar vários caminhos: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"]
Quando extraímos valores de vários caminhos, os valores são retornados em uma matriz.
O ->
Operador
O
->
O operador extrai um subcomponente de um documento JSON e retorna uma representação JSON desse subcomponente. Portanto, podemos alterar o primeiro exemplo para isso:
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]}
O
->
operador é sutilmente diferente do json_extract()
função:- O
->
O operador sempre retorna uma representação JSON do subcomponente. - O
json_extract()
A função só retorna JSON se houver dois ou mais argumentos de caminho (porque o resultado é então uma matriz JSON) ou se o argumento de caminho único fizer referência a uma matriz ou objeto. - Se houver apenas um argumento de caminho e esse caminho fizer referência a um JSON nulo ou uma string ou um valor numérico,
json_extract()
retorna o valor SQL NULL, TEXT, INTEGER ou REAL correspondente.
Portanto, veja o que acontece quando extraímos o nome de um cachorro do nosso 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"
Desta vez, está cercado por aspas. Isso porque retornou uma representação JSON do valor. Quando extraímos o mesmo valor com
json_extract()
anteriormente, obtemos uma representação SQL do valor. No entanto, também podemos usar o
->>
operador para retornar uma representação SQL. O ->>
Operador
O
->>
O operador funciona da mesma forma que o ->
operador, exceto que ->>
retorna uma representação SQL do subcomponente especificado. Especificamente, ele retorna um SQL TEXT
, INTEGER
, REAL
, ou NULL
valor que representa o subcomponente selecionado, ou NULL
se o subcomponente não existir. Portanto, aqui está o que acontece quando usamos o
->>
operador para extrair o nome do cachorro: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
Não está mais entre aspas.