psql - 检索包含特殊字符的json数据

时间:2016-08-08 12:17:00

标签: json psql

看起来我的psql DB包含一些格式错误的json字段,因此我无法使用 - >>检索此数据。运算符。

我有一个表格,列有#34;声誉"类型为json。

我执行查询以获得"声誉"特定对象的列:

select reputation from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e'

我收到以下结果,看起来像使用转义字符格式化的json:

"{\"status\": \"MALICIOUS\", \"scanner_match\": 33, \"first_seen\": \"2010-05-27T09:00:27\", \"scanner_count\": 34, \"last_seen\": \"2010-05-27T09:00:27\"}"

但是,当我试图在这个json中获得特定字段时,我什么也得不到:

select reputation->>status from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e'

我还尝试了以下查询来检查psql如何处理这个json并收到错误:

select * from json_each((select reputation from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e'));
ERROR:  cannot deconstruct a scalar

所以看起来psql不会将其识别为json。如果是这样,我有几个问题:

  1. 如果这是无效的json格式,那么psql如何允许我们将格式错误的json插入json类型列?
  2. 是否有可能以某种方式访问​​现有状态中的这些json字段(可能在名称中使用了一些特殊字符)?

1 个答案:

答案 0 :(得分:1)

它的反斜杠。 Psql将它们视为转义字符并插入到json数据类型中没有问题。

在sql中查看字符串被视为字符串而不是json,您需要执行一些字符串函数来删除错误的字符。

with cte as(
select cast ('"{\"status\": \"MALICIOUS\", \"scanner_match\": 33, \"first_seen\": \"2010-05-27T09:00:27\", \"scanner_count\": 34, \"last_seen\": \"2010-05-27T09:00:27\"}"'as json)  as string)

select cast(ltrim(rtrim(replace(cast(string as text),'\',''),'"'),'"')as json)
from cte

返回json数据类型