Json到CSV的通用转换方式,用于通用深层嵌套数组

时间:2019-02-27 10:18:45

标签: javascript arrays json typescript csv

我正在编写一个函数,该函数应该将通用的深层嵌套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""]"

2 个答案:

答案 0 :(得分: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 :(得分: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解析器知道如何处理的数据结构。