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.