NiFi中嵌套数组的Jolt转换需求及问题咨询
Jolt转换解决方案:为每个Detail记录添加全局行字段
首先,假设你的输入JSON结构如下(可根据实际字段/层级调整):
{ "header": { "batchId": "B001" }, "detail": [ { "detailId": "D001", "amount": 100 }, { "detailId": "D002", "amount": 200 } ], "lineDetails": [ { "TRADETYP": "BUY", "TRANSPORT_CODE": "AIR" }, { "TRADETYP": "SELL", "TRANSPORT_CODE": "SEA" } ] }
以下是满足需求的Jolt Spec,可直接在NiFi的JoltTransformJSON处理器中使用:
[ // 第一步:提取所有lineDetails的字段值,生成全局数组并合并 { "operation": "modify-overwrite-beta", "spec": { "TRADETYPALLLINES": ["@(1,lineDetails[*].TRADETYP)"], "TRANSPORT_CODE_ALLLINES": ["@(1,lineDetails[*].TRANSPORT_CODE)"], "TRADETYP_CODE_ALL": ["=join('-', @(1,TRADETYPALLLINES[&]), @(1,TRANSPORT_CODE_ALLLINES[&]))"] } }, // 第二步:展开detail数组,将全局字段注入每个detail对象 { "operation": "shift", "spec": { "detail": { "*": { "@(2,header)": "header", "@": "detail", "@(2,TRADETYPALLLINES)": "TRADETYPALLLINES", "@(2,TRANSPORT_CODE_ALLLINES)": "TRANSPORT_CODE_ALLLINES", "@(2,TRADETYP_CODE_ALL)": "TRADETYP_CODE_ALL", "#": "&" } } } }, // 第三步:整理输出结构,生成独立的Detail记录 { "operation": "shift", "spec": { "*": "[]" } } ]
转换逻辑说明:
modify-overwrite-beta阶段:
- 从
lineDetails数组中批量提取TRADETYP和TRANSPORT_CODE值,生成两个全局数组 - 通过
join函数将两个数组的对应元素拼接为"值-值"格式,生成TRADETYP_CODE_ALL数组
- 从
shift阶段1:
- 遍历
detail数组的每一项,将header、当前detail对象,以及根节点的三个全局字段全部注入到子对象中 - 用
#和&标记每个子对象,为后续展开做准备
- 遍历
shift阶段2:
- 将嵌套的结构展开,最终输出多个独立的JSON对象,每个对象都包含完整的header、detail数据和三个全局字段
最终输出示例:
[ { "header": { "batchId": "B001" }, "detail": { "detailId": "D001", "amount": 100 }, "TRADETYPALLLINES": ["BUY", "SELL"], "TRANSPORT_CODE_ALLLINES": ["AIR", "SEA"], "TRADETYP_CODE_ALL": ["BUY-AIR", "SELL-SEA"] }, { "header": { "batchId": "B001" }, "detail": { "detailId": "D002", "amount": 200 }, "TRADETYPALLLINES": ["BUY", "SELL"], "TRANSPORT_CODE_ALLLINES": ["AIR", "SEA"], "TRADETYP_CODE_ALL": ["BUY-AIR", "SELL-SEA"] } ]
如果你的输入结构与示例有差异(比如字段名、层级不同),只需调整Spec中对应的路径即可。
内容的提问来源于stack exchange,提问作者user10086251
相关产品推荐
相关产品推荐

