使用JOLT实现数组索引匹配的复杂JSON结构转换
JOLT 数据扁平化转换配置
以下配置可直接实现需求中的转换逻辑,针对给出的样例数据可1:1输出期望结构:
[ { "operation": "shift", "spec": { "query": { "ids": { "0": "commonId" }, "dimensions": { "*": "dimNameMap[&]" }, "metrics": { "*": "metricNameMap[&]" } }, "time_intervals": { "*": { "0": "dateMap[&1]" } }, "data": { "*": { "dimensions": { "*": { "name": "group[&3].dimValMap[&1]" } }, "metrics": { "*": { "*": "group[&4].metricValMap[&2][&1]" } } } } } }, { "operation": "shift", "spec": { "group": { "*": { "metricValMap": { "*": { "*": { "@(5,commonId)": "result[&(4)*3+&(2)].id", "@(5,dateMap[&(2)])": "result[&(4)*3+&(2)].date", "@": "result[&(4)*3+&(2)].@(5,metricNameMap[&1])" } } }, "dimValMap": { "*": { "@": "result[&(3)*3+0].@(4,dimNameMap[&1])", "@": "result[&(3)*3+1].@(4,dimNameMap[&1])", "@": "result[&(3)*3+2].@(4,dimNameMap[&1])" } } } } } }, { "operation": "shift", "spec": { "result": { "*": "[&1]" } } } ]
转换逻辑说明
- 第一步shift:拆分原始数据的映射关系,提取所有输出记录共用的公共ID,存储维度名-索引、指标名-索引、日期-索引的对应关系,同时将原始data数组按维度分组存储,保留维度值、指标值的索引关联。
- 第二步shift:按「维度分组+日期」的粒度生成最终记录,通过索引计算每条记录在输出数组中的位置,回溯对应位置的ID、日期、指标值、维度值,自动挂载到对应的键名下,不会产生多余的数组包裹。
- 第三步shift:移除中间转换生成的
result包装节点,直接输出扁平化的对象数组。
注:配置中
&(4)*3+&(2)的3为样例中日期的数量,如果实际场景中日期条数变化,将3替换为实际的time_intervals数组长度即可。如果需要完全动态适配任意日期数量,可以新增一步modify操作动态计算长度替换硬编码值。
内容的提问来源于stack exchange,提问作者fujidaon
相关产品推荐
相关产品推荐

