I have a column which type is JSON but it contains JSON strings like this:
"{\"a\":1,\"b\":2,\"c\":3}"
I want to update the values in the column with proper JSON objects without the quotes and escapes like this:
{"a":1,"b":2,"c":3}
I've tried the following statement even tough it says it does update rows, the columns are still the same.
UPDATE table SET column = to_json(column);
It seems like the to_json
function doesn't work since it is a JSON string?
How can I update those values?
CodePudding user response:
You could cast the JSON column as text, remove the unwanted quotes and escapes, and then cast the resulting text as JSON.
update tbl
set js = trim(replace(js::text, '\',''), '"')::json
CodePudding user response:
You can use the #>>
operator to extract the string and then convert it back to JSON with ::json
:
UPDATE your_table
SET your_column = (your_column #>> '{}')::json;
A fully working demo:
create table your_table (
your_column json
);
insert into your_table (your_column) values ('"{\"a\":1,\"b\":2,\"c\":3}"'::json);
select your_column, your_column #>> '{}'
from your_table ;
your_column | ?column? |
---|---|
"{"a":1,"b":2,"c":3}" | {"a":1,"b":2,"c":3} |
update your_table
set your_column = (your_column #>> '{}')::json;
select *
from your_table;
your_column |
---|
{"a":1,"b":2,"c":3} |