如何使用NodeJS将CSV转换为指定结构的嵌套JSON对象?
问题描述
我正在用NodeJS的csvtojson模块把CSV转成特定结构的JSON,现在差最后一步微调。
输入CSV内容
PoHeader.hdrComment,PoHeader.poNumber,PoHeader.shipDate,PoHeader.rushOrder,PoLines.0.item,PoLines.0.itemDesc,PoLines.0.line,PoLines.0.poNumber,PoLines.0.qtyOrder "FILL AND KILL","00100XXXXX","12/31/22","false","0000-SBAN","Henry s SFBAN Swamp Fox SFBAN",10,"00100XXXXX",1.000 "FILL AND KILL","00100XXXXX","12/31/22","false","0001-0099","Daiwa GC80 Goldcast Spincast R",20,"00100XXXXX",2.000 "FILL AND KILL","00100XXXXX","12/31/22","false","0001-1544","Daiwa MINISPIN Minispin Spinni",30,"00100XXXXX",3.000
期望的最终JSON结构
{ "PoHeader": { "hdrComment": "My comment", "orderClass": "SO", "poNumber": "test02", "shipDate": "06/14/18", "rushOrder": false, "rushOption": 1, "adultSignature": true }, "PoLines": [ { "item": "0001-3121", "itemDesc": "Some item", "linComment": "For John Doe", "line": 1, "poNumber": "test02", "qtyOrder": 1 } ] }
当前转换代码
csv() .fromFile(csvFilePath) .then((jsonObj)=>{ //console.log(jsonObj); sendPO(jsonObj); })
当前问题
运行后得到的jsonObj是三个重复对象,每个都包含相同的PoHeader和单个PoLine元素。我需要的是单个对象,包含一份PoHeader和所有PoLine组成的数组,具体结构如下:
{ PoHeader: { hdrComment: 'FILL AND KILL', poNumber: '00100XXXXX', shipDate: '12/31/22', rushOrder: 'false' }, PoLines: [ { item: '0000-SBAN', itemDesc: 'Henry s SFBAN Swamp Fox SFBAN', line: '10', poNumber: '00100XXXXX', qtyOrder: '1.000' }, { item: '0001-0099', itemDesc: 'Daiwa GC80 Goldcast Spincast R', line: '20', poNumber: '00100XXXXX', qtyOrder: '2.000' }, { item: '0001-1544', itemDesc: 'Daiwa MINISPIN Minispin Spinni', line: '30', poNumber: '00100XXXXX', qtyOrder: '3.000' } ] }
解决方案
在转换后的jsonObj基础上做数据聚合处理即可,步骤如下:
- 提取第一行的PoHeader(所有行的PoHeader内容一致)
- 遍历所有转换后的对象,收集每行的PoLine数据
- 组合成目标结构
修改后的代码如下:
csv() .fromFile(csvFilePath) .then((jsonArr)=>{ if (!jsonArr.length) return; // 提取PoHeader,可按需补充默认字段 const poHeader = { hdrComment: jsonArr[0]['PoHeader.hdrComment'], poNumber: jsonArr[0]['PoHeader.poNumber'], shipDate: jsonArr[0]['PoHeader.shipDate'], rushOrder: jsonArr[0]['PoHeader.rushOrder'] === 'false' ? false : true, orderClass: 'SO', rushOption: 1, adultSignature: true }; // 收集所有PoLines,并转换数据类型 const poLines = jsonArr.map(item => ({ item: item['PoLines.0.item'], itemDesc: item['PoLines.0.itemDesc'], line: parseInt(item['PoLines.0.line'], 10), poNumber: item['PoLines.0.poNumber'], qtyOrder: parseFloat(item['PoLines.0.qtyOrder']) })); // 组合成最终结构 const finalPO = { PoHeader: poHeader, PoLines: poLines }; sendPO(finalPO); })
说明
- 代码里把
rushOrder转成布尔值,line转整数,qtyOrder转浮点数,更贴合你期望的JSON类型 - 若不需要默认字段(如
orderClass),直接从poHeader对象中删除即可
内容的提问来源于stack exchange,提问作者matthh
相关产品推荐
相关产品推荐

