Em nosso banco de dados, uma coluna JSONB contém um objeto que possui uma propriedade que é um objeto JSON codificado em string. Preciso desserializar essa string durante a consulta e inspecionar seus valores.
create table datas (id int, data jsonb);
insert into datas (id, data) values (1, '{"key1": "{\"foo\": \"bar\"}"}');
Posso selecionar o valor da string, mas a conversão em um objeto JSONB não funciona. Todas essas consultas retornam null para o foo
.
select data->'key1'->'foo' from datas;
select to_json(data->'key1')->'foo' from datas;
select (data->'key1')::jsonb->'foo' from datas;
dbfiddle: https://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=9c0a9f7f1323a35051daba5177e52f57
Você precisa extrair o valor
text
usando o->>
operador, só então você pode convertê-lo de volta para um valorjson
oujsonb
:Mas a solução correta é não armazenar o valor de uma maneira que você precise lançar para frente e para trás toda vez que acessá-lo.
Isso ocorre porque quando você lança um
json
(oujsonb
) paratext
todas as aspas são mantidas. E se você converter'"{\"foo\": \"bar\"}"'
de volta para JSON, ainda será uma única string JSON, não um par de chave/valor. Veja aqui