给出Postgresql中的一个表,大致定义如下:
Column | Type | Modifiers | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+--------------+-------------
id | character varying | not null | extended | |
answers | json | | extended | |
我们不小心对这个双重编码的JSON对象数据库进行了多次插入,即json值是一个字符串,即json编码的对象 - 例如:
"{\"a\": 1}"
我们希望找到一个将这些值转换为它们所代表的JSON对象的查询,例如:
{"a": 1}
我们可以通过以下方式轻松选择错误值:
SELECT * FROM table WHERE json_type(answers) = 'string'
但我们无法想出一种在PSQL中解析JSON的方法。
答案 0 :(得分:3)
不幸的是,json[b]
类型没有直接的字符串提取功能,但您可以通过将值嵌入到JSON数组中来解决此问题。使用->>
运算符在0
数组索引处进行字符串提取:
UPDATE table
SET answers = (CONCAT('[', answers::text, ']')::json ->> 0)::json
WHERE json_type(answers) = 'string'
这也适用于较低的PostgreSQL版本(9.3)。对于较新版本(9.4+),您也可以使用json_build_array()
function。