如何使用Mirth Connector将嵌套JSON转换为CSV?新手求助
解决Mirth Connector中JSON转CSV输出单行的问题
嘿,刚上手Mirth Connector遇到这种问题太正常了!我看了你贴的代码,主要是循环逻辑没处理好嵌套JSON,而且没正确生成多行的CSV结构,导致最后只输出一行。我给你整理了修复后的方案,一步步来:
原代码的核心问题
- 表头(
col)的定义放在了循环里,每次遍历元素都会重新创建,而且逻辑不对 - 嵌套JSON的遍历代码截断了,没处理完深层字段
- 没有把每一行数据单独添加到输出集合里,最后自然只会有一行
修复后的完整代码
// 假设你的jsonObject已经是解析好的JSON数组(如果是字符串,先加var jsonObject = JSON.parse(payload);) var headers = []; var rows = []; // 递归收集所有字段作为表头,嵌套字段用"父字段.子字段"格式 function collectKeys(obj, prefix = '') { for (var key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null) { collectKeys(obj[key], prefix + key + '.'); } else { var fullKey = prefix + key; if (!headers.includes(fullKey)) { headers.push(fullKey); } } } } // 先从第一个元素提取所有表头(如果JSON结构统一,这样效率最高) if (jsonObject.length > 0) { collectKeys(jsonObject[0]); } // 遍历每个JSON元素,生成对应行数据 for each (element in jsonObject) { var rowData = {}; // 递归填充当前元素的所有字段到rowData function fillRow(obj, prefix = '') { for (var key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null) { fillRow(obj[key], prefix + key + '.'); } else { var fullKey = prefix + key; rowData[fullKey] = obj[key] ? obj[key].toString() : ''; } } } fillRow(element); // 按照表头顺序生成一行数据,避免列错位 var row = []; for each (header in headers) { row.push(rowData[header] || ''); } rows.push(row); } // 拼接成标准CSV格式,处理特殊字符(逗号、引号) var csvContent = headers.join(',') + '\n'; for each (row in rows) { var escapedRow = row.map(function(cell) { // 把字段里的双引号转成两个,再用双引号包裹字段 return '"' + cell.replace(/"/g, '""') + '"'; }); csvContent += escapedRow.join(',') + '\n'; } // 将生成的CSV设置为输出payload response.setPayload(csvContent);
关键说明
- 处理嵌套JSON:用递归函数把嵌套字段转成
user.name这种扁平格式,确保所有字段都能对应到CSV的列 - 表头只生成一次:从第一个JSON元素提取所有表头,避免重复或缺失
- 多行生成:把每个元素对应的行数据存到
rows数组里,最后统一拼接成完整CSV,自然就会有多行输出 - CSV规范兼容:自动处理包含逗号、双引号的字段,避免CSV格式出错
额外提醒
- 如果你的输入是JSON字符串,记得先加
var jsonObject = JSON.parse(payload);把字符串转成JSON对象 - 把这段代码放在Mirth通道的Transformer环节的JavaScript步骤里,就能替换原来的代码啦
内容的提问来源于stack exchange,提问作者Rjj
相关产品推荐
相关产品推荐

