2016-07-07 6 views
2

Внутри моей функции Postgres, у меня есть набор JSON:PostgreSQL. Создание вложенных объектов JSON

{"layer_name":"rooms","properties":{"fillOpacity":1,"strokeColor":"#606576","strokeWidth":"3"}} 
{"layer_name":"map","properties":{"fillColor":"#3D404F"}} 

Мне нужно изменить его структуру:

{ 
    "rooms": {"fillOpacity":1,"strokeColor":"#606576","strokeWidth":"3"}}, 
    "map: {"fillColor":"#3D404F"} 
} 

Я пытался перебирать установить и заполнить два массива (один для ключей, другие VOR falues), так что я мог бы использовать json_object(keys text[], values text[]) создать необходимую JSON:

CREATE OR REPLACE FUNCTION appearance.get_styles(out response text) 
    RETURNS text 
AS 
$BODY$ 
    declare 
    vResult json; 
    i json; 
    keys TEXT[]; 
    vals TEXT[]; 
    layers json; 
begin 
    with a as (SELECT layer_name, properties FROM appearance.styles) 
    select json_agg(a) 
    into vResult 
    from a; 

    FOR i IN SELECT * FROM json_array_elements(vResult) 
    LOOP 
    RAISE NOTICE 'props %', i; 
    keys = array_append(keys, i->>'layer_name'); 
    vals = array_append(vals, i->>'properties'); 

    END LOOP; 
    layers = json_object(keys, vals); 
    RAISE NOTICE 'props %', layers; 

response := concat ('"layersStyles"', ':', coalesce(layers::text,'[]')); 
response := '{' || response || '}'; 

end; 
$BODY$ 
LANGUAGE plpgsql VOLATILE SECURITY DEFINER; 

но проблема в том, что я должен бросить json в text, и в конце концов я получаю спасся строка в качестве значения:

"map" : "{\"fillColor\":\"#3D404F\"}", "rooms" : "{\"fillOpacity\":1,\"strokeColor\":\"#606576\",\"strokeWidth\":\"3\"}"} 

И это не то, что мне нужно. Я не могу понять, как сделать вложенные объекты json. Не вижу никаких функций для него here. Есть ли лучший подход?

ответ

0

Решено с помощью json_object_agg функция.

CREATE OR REPLACE FUNCTION appearance.get_styles(out response text) 
    RETURNS text 
AS 
$BODY$ 
    declare 
    vResult json;  
begin 
    SELECT json_object_agg("layer_name", "properties") from appearance.styles 
    into vResult; 
    response := concat ('"layersStyles"', ':', coalesce(vResult::text,'[]')); 
    response := '{' || response || '}'; 

end; 
$BODY$ 
LANGUAGE plpgsql VOLATILE SECURITY DEFINER; 
Смежные вопросы