删除 PSQL 中的双编码 JSON 值

Kev*_*lan 4 postgresql json

给定 Postgresql 中的一个表,其定义大致如下:

   Column    |            Type             | Modifiers | Storage  | Stats target | Description 
-------------+-----------------------------+-----------+----------+--------------+-------------
 id          | character varying           | not null  | extended |              | 
 answers     | json                        |           | extended |              | 
Run Code Online (Sandbox Code Playgroud)

我们不小心在这个数据库中插入了一些双重编码的 JSON 对象,即 json 值是一个字符串,即一个 json 编码的对象——例如:

"{\"a\": 1}"

我们希望找到一个查询,将这些值转换为它们表示的 JSON 对象,例如:

{"a": 1}

我们可以通过执行以下操作轻松选择不良值:

SELECT * FROM table WHERE json_type(answers) = 'string'

但我们在想出一种在 PSQL 中解析 JSON 的方法时遇到了困难。

poz*_*ozs 7

不幸的是,没有json[b]直接针对类型的字符串提取函数,但您可以通过将值嵌入 JSON 数组并使用数组索引->>处的字符串提取运算符来解决此问题0

UPDATE table
SET    answers = (CONCAT('[', answers::text, ']')::json ->> 0)::json
WHERE  json_type(answers) = 'string'
Run Code Online (Sandbox Code Playgroud)

这也应该适用于较低版本的 PostgreSQL (9.3)。对于较新的版本(9.4+),您也可以使用该json_build_array()功能