7

PostgreSQL 9.3 で新しい JSON 機能を使用しようとしています。to_json(anyelement) の反対である JSON をエスケープ解除する関数を探しています。

以下は JSON の例です。

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

クエリ:

SELECT json_array_elements(json_column->'comments_array')

ドキュメントで説明されているように、SET OF JSON を返します。

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

結果をエスケープ解除する方法はありますか?次の結果を得ることができます:

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

ドキュメントには、私を助けることができる機能はありません。残念ながら、PLV8 を挿入することは私にとって選択肢ではありません。

どんなアイデアでも大歓迎です。

4

4 に答える 4

2

私は自分でこの問題に出くわしました。ここに私がどのようにアプローチしたかを示します。配列を反復処理し、添え字を使用して ->> 演算子を使用してテキスト値を取得するヘルパー関数を作成しました。誰かがより良い方法を知っているなら、私はそれについて聞いてうれしい.

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)

配列を直接処理したくない場合は、関数が一連のテキストを返すようにすることもできます。

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)
于 2014-05-26T00:45:15.173 に答える
0

JSON を少し変更するだけで、結果を得ることができました。

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

文字列の配列を使用する代わりに、オブジェクトの配列を使用すると、次のクエリが思い通りに機能します。

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

今のところ、これは私のニーズに合っていますが、文字列の配列から出力を達成する方法を誰かが知っている場合は、共有してください:)

于 2013-10-18T07:37:11.550 に答える