Внутри моей функции 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. Есть ли лучший подход?