如何在Talend中提取特殊结构JSON并转换为标准结构化数据?
Talend 特殊结构JSON转换实现方案
方案1:纯组件组合实现(无需编码)
- 第一步:解析源JSON
用tFileInputJSON组件解析原始JSON,分别提取两个核心数组:- 提取
results[0].series[0].columns数组,输出为单列列表,暂存到tHashSet组件 - 提取
results[0].series[0].values二维数组,输出为每一行对应一个子数组的单列列表
- 提取
- 第二步:生成动态列名全局变量
读取tHashSet中存储的列名列表,用tConvertType将数组转为逗号分隔的字符串,赋值给全局变量globalColumnList - 第三步:字段与值匹配映射
用tSplit将每行value数组按逗号拆分,拆分后的列索引与globalColumnList的列名索引一一对应,传入tMap完成字段重命名,即可得到结构化的标准表结构数据 - 第四步:结果输出
直接连接tFileOutputDelimited输出CSV,或连接tFileOutputJSON输出键值对格式的标准JSON即可
方案2:tJavaRow代码实现(适配动态列数场景)
如果列数不固定,用代码实现更高效,操作步骤如下:
- 先用
tFileInputJSON提取出columns数组和values数组,作为两个入参字段传入tJavaRow - 在
tJavaRow中写入以下逻辑:
import java.util.*; // 读取列名数组 String[] columns = (String[])input_row.columns.toArray(new String[0]); // 遍历所有行值 for (Object valueItem : input_row.values) { String[] values = (String[])((List)valueItem).toArray(new String[0]); Map<String, String> outputMap = new HashMap<>(); // 按索引匹配列名和值 for (int i = 0; i < columns.length; i++) { outputMap.put(columns[i], values[i]); } // 输出映射后的行数据到下游组件 output_row.structData = outputMap; }
- 下游组件直接读取
structData字段中的键值对,按需输出为表格、CSV或标准JSON即可
若JSON中
results节点包含多个series,可先加一层tLoop遍历每个series节点,再执行上述映射逻辑即可
内容的提问来源于stack exchange,提问作者wmbff
相关产品推荐
相关产品推荐

