2013-10-16 2 views
4

PostgreSQL 9.3에서 새로운 JSON 기능을 사용하려고하며 to_json (anyelement)의 oposite 인 JSON을 이스케이프 처리하지 않는 함수를 찾고 있습니다.PostgreSQL unescape JSON 문자열

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

쿼리 : 문서에 JSON 세트를 VII로부터

SELECT json_array_elements(json_column->'comments_array') 

반환 아래

은 샘플 JSON이다.

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

그 결과를 언 이스케이프하는 방법이있다, 그래서 나는 다음과 같은 결과가있을 수 있습니다 : 나는 나를 도울 수있는 기능이 표시되지 않는 문서에서

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

합니다. 불행히도 PLV8을 부르는 것은 나를위한 선택 사항이 아닙니다.

모든 아이디어는 높이 평가됩니다.

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

대신 문자열의 배열을 가진의는 지금 우리가 객체의 배열을 사용하고 난에 원하는대로 다음 쿼리가 작동합니다

+0

Err ... Fred가 "안녕하세요." "그냥 다른 글쓰기 방법"이라고 말했고 Fred는 "안녕하세요."라고 대답했습니다. –

+0

'json_array_elements' 대신'json_each_text'를 시도해 보셨습니까? –

+1

json_each_text는 key-> value 구조로 작동합니다. JSON 배열이 있습니다. – Dan

답변

1

이다 나는 단지 이 문제를 직접 짚어 보았습니다. 어떻게 접근 했습니까? 내가 배열을 반복하고 텍스트 값을 다시 얻으려면 subscript를 사용하여 - >> 연산자를 사용하는 도우미 함수를 만들었습니다. 더 좋은 방법을 아는 사람이라면 누구나이 정보를 듣게되어 기쁩니다.

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; 
: 직접 배열과 거래를하고 싶지 않을 경우 당신은 또한 함수가 단지 SETOF 텍스트를 반환 할 수

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) 

:

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_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의 약간의 수정과 결과를 달성하기 위해 관리했습니다 : 지금이 들어

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;