Json到通用深层嵌套数组的CSV转换的通用方法

问题描述 投票:3回答:2

我正在编写一个函数,它应该将通用的深层嵌套JSON对象级别转换为JS或TypeScript中的CSV文件。我尝试了几个库,但不知怎的,它们不能按照我希望它展开嵌套JSON权限的方式工作。代码应解除此输入:

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

进入这个预期的结果:

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

现在我正在使用此代码,但结果与预期不符:

 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;
  }

我现在的结果如下:

"app","device"
"app1","[""c1"",""c2"",""c3"",""c4""]"
"app2","[""b1"",""b2""]"
javascript arrays json typescript csv
2个回答
1
投票

是的,你可以这样做 - 它在与unwind function的文档中是正确的,虽然你可能需要添加一个变换器来准确地格式化你想要的方式。看一看:

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'});

如果这可以解决您的问题,或者如果没有,请告诉我。我对这个lib有一些经验,可能会有所帮助


1
投票

我建议展平您的数据,然后只使用您拥有的csv解析器。

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

然后你将拥有一个csv解析器知道如何处理的数据结构。

© www.soinside.com 2019 - 2024. All rights reserved.