javascript - Generisk måte å konvertere Json til CSV på for generiske dypt nestede arrayer


Jeg programmerer en funksjon som skal konvertere generiske dypt nestede JSON-objektnivåer til CSV-fil i JS eller TypeScript. Jeg har prøvd flere biblioteker, men på en eller annen måte fungerer de ikke slik jeg vil for å pakke ut den nestede JSON-en riktig. Koden skal pakke ut denne inputen:

{
 [
  {
     app: "app1",
     device: [
       "c1",
       "c2",
       "c3",
       "c4"
     ]
   },
   {
     app: "app2",
     device: [
       "b1",
       "b2"
     ]
   }
 ]
}

Inn i dette forventede resultatet:

app;device
app1;c1
app1;c2
app1;c3
app1;c4
app2;b1
app2;b2

Akkurat nå bruker jeg denne koden, men resultatet er ikke som forventet:

 private ConvertToCSV(json: string, fields: string[]): string {
    const Json2csvParser = require("json2csv").Parser;

    let options: {};

    options = { fields };

    const parser = new Json2csvParser(options);

    const csv = parser.parse(JSON.parse(json));
    console.log(JSON.parse(json));
    console.log(csv);
    return csv;
  }

Mitt resultat ser akkurat nå slik ut:

"app","device"
"app1","[""c1"",""c2"",""c3"",""c4""]"
"app2","[""b1"",""b2""]"

Svar #1

Ja, du kan gjøre dette -- det står rett i dokumentasjonen med unwind-funksjonen, selv om du kanskje må legge til en transformator for å formatere det akkurat slik du vil. Ta en titt:

const data: any = [
  {
     app: "app1",
     device: [
       "c1",
       "c2",
       "c3",
       "c4"
     ]
   },
   {
     app: "app2",
     device: [
       "b1",
       "b2"
     ]
   }
 ];

function ConvertToCSV(json: string, fields: any): string {
  const Json2csvParser = require("json2csv").parse;

  let options: {};

  options = fields;

  const csv = Json2csvParser(JSON.parse(json), options);
  console.log(JSON.parse(json));
  console.log(csv);
  return csv;
}

ConvertToCSV(JSON.stringify(data), {fields: ['app', 'device'], unwind: 'device'});

Gi meg beskjed hvis dette løser problemet ditt, eller hvis det ikke gjør det. Jeg har litt erfaring med dette biblioteket og kan kanskje hjelpe

Svar #2

Jeg vil anbefale å flate ut dataene dine og deretter bare bruke CSV-parseren du har.

function flattenData(data,groupingField,flattenedField) {
  let flattenedData =[];
  data.forEach(d => {
    d[flattenedField].forEach(sd => {
      flattenedData.push({[groupingField]: d[groupingField], [flattenedField]: sd});
    });
  });
  return flattenedData;
}

Da vil du ha en datastruktur som csv-parseren din vet hvordan den skal håndtere.