2013-10-16 52 views
4

我想在PostgreSQL 9.3中使用新的JSON功能,我正在尋找一個unescapes JSON函數,to_json(anyelement)的反例。PostgreSQL unescape JSON字符串

下面是一個示例JSON:

{"single_comment": "Fred said \"Hi.\"" , 
"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]} 

查詢:如文檔中descibed JSON的SET

SELECT json_array_elements(json_column->'comments_array') 

回報。

"Fred said \"Hi.\"" 
"Fred said \"Hi.\"" 
"Fred said \"Hi.\"" 

是否有反轉義結果的方式,所以我可以有以下結果:

Fred said "Hi." 
Fred said "Hi." 
Fred said "Hi." 

在本文檔中我沒有看到任何功能,可以幫助我。不幸的是,隱藏PLV8不適合我。

任何想法,高度讚賞。

+0

Err ...不是'「Fred說\」嗨。\「''只是另一種寫作方式'Fred說:」嗨。「」? –

+0

你試過'json_each_text'而不是'json_array_elements'嗎? –

+1

json_each_text使用鍵 - >值結構,我有一個JSON數組。 – Dan

回答

1

我只是自己跑過這個問題,這是我如何接近它。我創建了一個幫助函數,它遍歷數組,並使用 - >>操作符使用下標獲取文本值。如果有人知道更好的方法,我很高興聽到它,因爲這似乎有點klunky。

CREATE OR REPLACE FUNCTION json_text_array_to_pg_text_array(data json) returns text[] AS $$ 
DECLARE 
    i integer; 
    agg text[]; 
BEGIN 
    FOR i IN 0..json_array_length(data)-1 LOOP 
     agg := array_append(agg, data->>i); 
    END LOOP; 

    return agg; 
END 
$$ language plpgsql; 

然後,你可以做這樣的事情:

test=# select json_text_array_to_pg_text_array('[ "hello","the\"re","i''m", "an", "array" ]'::json); 
json_text_array_to_pg_text_array 
---------------------------------- 
{hello,"the\"re",i'm,an,array} 
(1 row) 

你也可以使函數只返回一個SETOF文本,如果你不想做處理直接數組:

CREATE OR REPLACE FUNCTION json_text_array_to_row(data json) returns setof text AS $$ 
DECLARE 
    i integer; 
BEGIN 
    FOR i IN 0..json_array_length(data)-1 LOOP 
     return next data->>i; 
    END LOOP; 
    return; 
END 
$$ language plpgsql; 

然後做到這一點:

test=# select json_text_array_to_row('{"single_comment": "Fred said \"Hi.\"" ,"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}'::json->'comments_array'); 
json_text_array_to_row 
------------------------ 
Fred said "Hi." 
Fred said "Hi." 
Fred said "Hi." 
(3 rows) 
0

我已經成功地實現了與JSON的稍加修改的結果:

{"comments_array": [{"comment": "Fred said \"Hi.\""}, {"comment": "Fred said \"Hello.\""}]} 

而不必字符串數組的,現在我們使用對象的數組,下面的查詢工作,因爲我想:

SELECT (json_array_elements(json_column->'comments_array'))->>'comment' 

現在這是要適合我的需求,但如果有人知道的方式,我們如何能實現從字符串數組輸出,請分享:)

0
select t.comments->>0 from 
(select jsonb_array_elements(your_table.json_column->'comments_array') as comments 
from your_table) as t;