2016-08-08 47 views
0

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

我有一个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\"}" 

然而,当我“M试图让这个JSON特定的领域,我得到什么:

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

我一个LSO尝试下面的查询,以检查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字段在现有的状态(可能使用名称中的一些特殊字符)?

回答

0

它的反斜杠。 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数据类型