в вашем случае, в случае работы с объектом можно пойти таким путем:
DO
$$
DECLARE
objectOrigin jsonb;
objectModingCount jsonb;
objectModingCraft jsonb;
arrayCraft jsonb;
BEGIN
objectOrigin = '{"craft":[], "count":0}'::jsonb;
arrayCraft = objectgetvaluearray(objectOrigin, 'craft', '[]');
arrayCraft = arraypushstring(arrayCraft, 'string');
arrayCraft = arraypushnumber(arrayCraft, '1234567890');
arrayCraft = arraypushboolean(arrayCraft, 'true');
arrayCraft = arraypushobject(arrayCraft, '{}');
arrayCraft = arraypusharray(arrayCraft, '[]');
objectModingCount = objectsetvaluenumber(objectModingCount, 'count', 2);
objectModingCraft = objectsetvaluearray(objectModingCraft, 'craft', arrayCraft);
objectOrigin = objectOrigin || objectModingCount || objectModingCraft;
RAISE NOTICE '%', objectOrigin;
END;
$$
LANGUAGE plpgsql;
NOTICE: {"count": 2, "craft": ["string", 1234567890, true, {}, []]}
CONTEXT: PL/pgSQL function inline_code_block line 21 at RAISE
результат запроса (1 строка) отброшен.
Query returned successfully with no result in 18 msec.
objectgetvaluearray, arraypushstring, arraypushnumber, arraypushboolean, arraypushobject, arraypusharray, objectsetvaluenumber, objectsetvaluearray - это мои обертки над стандартными функциями (устал в коде вечно приводить к типу и всякие скобки и тире писать), обычные getters и setters.
есть еще функция jsonb_set, с ее помощью можно манипулировать данными нужной глубины. почитайте в документации. в документации много описано и с примерами, также загляните в раздел функций в pg_catalog и найдите все функции у которых название начинается на "jsonb_", поиграйтесь с ними.
настоятельно рекомендую изучить особенность конкатенации объектов и массивов jsonb.