如何编写通用Jolt转换规则实现嵌套数据转线性数据
Jolt转换规则:嵌套JSON转线性格式
先明确要覆盖的4种输入场景及对应输出效果:
场景1:subList元素包含S1、S2字段
输入:
{ "practice_loc": "NY", "prac_num": "PN001", "topId": "T100", "subList": [ {"S1": "s1_val1", "S2": "s2_val1"}, {"S1": "s1_val2", "S2": "s2_val2"} ] }输出:
[ { "practice_loc": "NY", "prac_num": "PN001", "topId": "T100", "S1": "s1_val1", "S2": "s2_val1" }, { "practice_loc": "NY", "prac_num": "PN001", "topId": "T100", "S1": "s1_val2", "S2": "s2_val2" } ]
场景2:subList元素仅含S1字段
输入:
{ "practice_loc": "CA", "prac_num": "PN002", "topId": "T200", "subList": [ {"S1": "s1_val3"}, {"S1": "s1_val4"} ] }输出:
[ { "practice_loc": "CA", "prac_num": "PN002", "topId": "T200", "S1": "s1_val3" }, { "practice_loc": "CA", "prac_num": "PN002", "topId": "T200", "S1": "s1_val4" } ]
场景3:subList元素仅含S2字段
输入:
{ "practice_loc": "TX", "prac_num": "PN003", "topId": "T300", "subList": [ {"S2": "s2_val5"}, {"S2": "s2_val6"} ] }输出:
[ { "practice_loc": "TX", "prac_num": "PN003", "topId": "T300", "S2": "s2_val5" }, { "practice_loc": "TX", "prac_num": "PN003", "topId": "T300", "S2": "s2_val6" } ]
场景4:subList元素无S1、S2字段
输入:
{ "practice_loc": "FL", "prac_num": "PN004", "topId": "T400", "subList": [ {}, {} ] }输出:
[ { "practice_loc": "FL", "prac_num": "PN004", "topId": "T400" }, { "practice_loc": "FL", "prac_num": "PN004", "topId": "T400" } ]
通用Jolt转换规则
[ { "operation": "shift", "spec": { "subList": { "*": { "@(2,practice_loc)": "[&1].practice_loc", "@(2,prac_num)": "[&1].prac_num", "@(2,topId)": "[&1].topId", "S1": "[&1].S1", "S2": "[&1].S2" } } } } ]
规则说明
shift是Jolt重组JSON结构的核心操作,负责字段映射与结构展平subList.*遍历数组内每个元素,&1代表当前元素的索引,用来定位输出数组的对应位置@(2,practice_loc)表示向上回溯2层(从subList元素层到根节点)提取字段值,复制到当前输出记录中S1、S2字段直接映射到输出位置,原元素无对应字段时,输出自动忽略,适配所有场景
内容的提问来源于stack exchange,提问作者dracile
相关产品推荐
相关产品推荐

