sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL unescape JSON-sträng

Jag stötte precis på det här problemet själv, och här är hur jag närmade mig det. Jag skapade en hjälpfunktion som itererar över arrayen och använder operatorn ->> med hjälp av ett subskript för att få tillbaka textvärdet. Om någon vet ett bättre sätt är jag glad att höra om det, för det här verkar lite klumpigt.

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;

Då kan du göra saker 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 också få funktionen att bara returnera en uppsättning text om du inte vill hantera arrayerna direkt:

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;

Och gör sedan så här:

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. SQL Server parallell till Oracle DBMS_METADATA.GET_DDL?

  2. Hur länkar man dockercontainrar på build?

  3. Var är skillnaderna med XML och MySQL-databas? Vilken ska jag använda?

  4. Linq till SQL och identity_insert