PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL Unescape-JSON-String

Ich bin gerade selbst auf dieses Problem gestoßen, und hier ist, wie ich es angegangen bin. Ich habe eine Hilfsfunktion erstellt, die über das Array iteriert und den ->> Operator mit einem Index verwendet, um den Textwert zurückzubekommen. Wenn jemand einen besseren Weg kennt, freue ich mich, davon zu hören, denn das scheint ein bisschen klobig zu sein.

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;

Dann können Sie Dinge tun wie:

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)

Sie könnten die Funktion auch dazu bringen, nur einen Satz Text zurückzugeben, wenn Sie sich nicht direkt mit den Arrays befassen möchten:

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;

Und dann tun Sie dies:

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)