Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

The best way to parse array of objects Postgresql?

I’m getting the result:

tools: '{"(2,adobe-xd,\\"Adobe XD\\")","(42,wordpress,Wordpress)"}',
images: '{"(18,,)", "(19,heel,\\"\\")"}'

from typeorm query function:

select
...
coalesce(array_agg(distinct row(tools.id, tools.value, tools.name)) filter (where tools.id is not null), '{}') as tools,
coalesce(array_agg(distinct row(images.id, images.title, images.description)) filter (where images.id is not null), '{}') as images
from project 
LEFT JOIN "project_tools_tool" "project_tools" ON "project_tools"."projectId"="project"."id" 
LEFT JOIN "tool" "tools" ON "tools"."id"="project_tools"."toolId"  
LEFT JOIN "project_image" "images" ON "images"."project_id"="project"."id"
where project.id in (select project.id from project order by project.order desc offset 3 limit 4)
group by project.id
order by project.order desc

And I want to parse tools and images into normal object array like:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

tools: [
  {
    id: 2,
    value: 'adobe-xd',
    name: 'Adobe XD'
  }, {
    id: 42,
    value: 'wordpress',
    name: 'Wordpress'
  }
],
images: [
  {
    id: 18,
    title: null,
    description: null
  }, {
    id: 19,
    title: 'heel',
    description: ''
  }
]

What is the best way to parse it? Is it possible to parse it in postgresql query?

>Solution :

Here’s a solution using regex, probably there are existing libraries to do it but if you want to DIY:

const tools = '{"(2,adobe-xd,\\"Adobe XD\\")","(42,wordpress,Wordpress)"}';
const images = '{"(18,,)", "(19,heel,\\"\\")"}';

const parsePostgresqlObject = str => {
  return JSON.parse(str.replace(/^{/, '[').replace(/}$/, ']')).map(chunk => {
    const [_, ...matches] = chunk.match(/^\((.*?),(.*?),(.*)\)$/);
    const [id, title, description] = matches.map(e => {
      if(!e) return null;
      try {
        return JSON.parse(e);
      } catch(ex) {
        return e;
      }
    });
    return { id, title, description };
  });
};

console.log(parsePostgresqlObject(tools));
console.log(parsePostgresqlObject(images));
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading