sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL unescape JSON-streng

Jeg stødte lige på dette problem selv, og her er, hvordan jeg greb det an. Jeg oprettede en hjælpefunktion, der itererer over arrayet og bruger ->> operatoren ved at bruge et sænket skrift for at få tekstværdien tilbage. Hvis nogen kender en bedre måde, hører jeg gerne om det, for det virker lidt klunset.

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;

Så kan du gøre ting som:

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)

Du kan også få funktionen til bare at returnere et sæt tekst, hvis du ikke ønsker at beskæftige dig med arrays direkte:

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;

Og gør derefter dette:

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)


  1. Opdater databasetabel med afkrydsningsfelter, php og mysql

  2. MYSQL :Kopier data fra tabeller fra 2 databaser. Begge databaser er på forskellige servere (hostingfirmaer)

  3. er der en filstørrelsesgrænse, når du opretter en csv-fil ved hjælp af php og mysql?

  4. Hvad er den korrekte kodning / escape / html-entities nødvendig, når du sender data fra js til php, php til mysql og til REST json-svar