2016-08-08 68 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數據類型