如何在NiFi中用Jolt Transform按ID关联合并双JSON数组
基于公共ID构建嵌套JSON结构的解决方案
需求说明
给定包含两个JSON数组的列表,两个数组共享公共列ID,需将第二个数组的内容作为对应ID的嵌套Details数组,合并为指定的嵌套结构。
输入数据
[ [ { "ID": "1", "A1": "test", "B1": "test1" } ], [ { "SubID": "1", "ID": "1", "C1": "test2", "D1": "test3" }, { "SubID": "2", "ID": "1", "C1": "test4", "D1": "test5" } ] ]
期望输出
{ "Header": { "ID": "1", "A1": "test", "B1": "test1", "Details": [ { "SubID": "1", "C1": "test2", "D1": "test3" }, { "SubID": "2", "C1": "test4", "D1": "test5" } ] } }
实现方案(JavaScript)
以下是通用的实现代码,可适配多个头部项和详情项的场景:
// 输入数据 const input = [ [ { "ID": "1", "A1": "test", "B1": "test1" } ], [ { "SubID": "1", "ID": "1", "C1": "test2", "D1": "test3" }, { "SubID": "2", "ID": "1", "C1": "test4", "D1": "test5" } ] ]; // 拆分头部数组与详情数组 const [headerList, detailsList] = input; // 按ID分组详情数据,同时移除详情项中的ID字段 const groupedDetails = detailsList.reduce((group, item) => { const { ID, ...detail } = item; if (!group[ID]) group[ID] = []; group[ID].push(detail); return group; }, {}); // 构建嵌套结构 const result = { Header: headerList.map(header => ({ ...header, Details: groupedDetails[header.ID] || [] }))[0] // 示例中仅一个头部项,直接取第一个元素 }; // 输出结果 console.log(JSON.stringify(result, null, 2));
代码说明
- 拆分数据:通过解构赋值将输入的两个数组分别提取为头部数据列表和详情数据列表。
- 分组详情:使用
reduce方法将详情数据按ID分组,同时剔除每个详情项中的ID字段(避免重复)。 - 构建嵌套:遍历头部数据列表,为每个头部对象添加
Details字段,对应分组后的详情数组;示例中头部仅一项,直接取第一个结果。
内容的提问来源于stack exchange,提问作者user3205552
相关产品推荐
相关产品推荐

