在PSQL中删除双重编码的JSON值

时间:2017-03-17 14:52:11

标签: json postgresql

给出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的方法。

1 个答案:

答案 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