JOLT转换后数组出现null值的原因及消除方法咨询
JOLT转换中null值的产生原因及解决方法
问题描述
输入数据
{ "data": [ { "val": 0, "fechaOffsetLocal": "2023-04-26T00:05:00", "TicketId": 49562693, "MedicionId": "80041", "utc": -6 }, { "val": 0, "fechaOffsetLocal": "2023-04-26T00:10:00", "TicketId": 49562693, "MedicionId": "80042", "utc": -6 } ] }
转换规格(SPEC)
[ { "operation": "shift", "spec": { "data": { "*": { "val": "@(1,MedicionId)[&1].&", "fechaOffsetLocal": "@(1,MedicionId)[&1].&", "utc": "@(1,MedicionId)[&1].&" } }, "TicketId": "TicketId" } } ]
转换后输出
{ "80041": [ { "val": 0, "fechaOffsetLocal": "2023-04-26T00:05:00", "utc": -6 } ], "80042": [ null, { "val": 0, "fechaOffsetLocal": "2023-04-26T00:10:00", "utc": -6 } ] }
null值产生的原因
你的shift规格中,[&1]引用的是当前data数组的元素索引(第一个元素索引为0,第二个为1)。当处理第二个data元素(MedicionId=80042)时,你指定将字段放到80042[1]的位置,这会强制创建一个长度为2的数组,而索引0的位置没有对应的数据填充,JOLT会自动用null补全这个空位置。
第一个元素(MedicionId=80041)使用的是索引0,数组仅需填充该位置,因此不会出现null。
如何移除/避免null值?
方案1:调整shift路径,避免指定固定数组索引
把[&1]改成[],这样每个MedicionId对应的数组只会追加当前元素,不会因为强制指定索引生成空位置:
修改后的SPEC:
[ { "operation": "shift", "spec": { "data": { "*": { "val": "@(1,MedicionId)[].&", "fechaOffsetLocal": "@(1,MedicionId)[].&", "utc": "@(1,MedicionId)[].&" } }, "TicketId": "TicketId" } } ]
转换后输出:
{ "80041": [ { "val": 0, "fechaOffsetLocal": "2023-04-26T00:05:00", "utc": -6 } ], "80042": [ { "val": 0, "fechaOffsetLocal": "2023-04-26T00:10:00", "utc": -6 } ], "TicketId": 49562693 }
方案2:直接映射为对象(无需数组结构)
如果每个MedicionId仅对应一个对象,可以去掉数组标识[],直接映射:
修改后的SPEC:
[ { "operation": "shift", "spec": { "data": { "*": { "val": "@(1,MedicionId).&", "fechaOffsetLocal": "@(1,MedicionId).&", "utc": "@(1,MedicionId).&" } }, "TicketId": "TicketId" } } ]
转换后输出:
{ "80041": { "val": 0, "fechaOffsetLocal": "2023-04-26T00:05:00", "utc": -6 }, "80042": { "val": 0, "fechaOffsetLocal": "2023-04-26T00:10:00", "utc": -6 }, "TicketId": 49562693 }
方案3:用remove操作清理已生成的null值
如果无法修改shift逻辑,可以在后续添加remove操作,移除数组中的null元素:
修改后的SPEC:
[ { "operation": "shift", "spec": { "data": { "*": { "val": "@(1,MedicionId)[&1].&", "fechaOffsetLocal": "@(1,MedicionId)[&1].&", "utc": "@(1,MedicionId)[&1].&" } }, "TicketId": "TicketId" } }, { "operation": "remove", "spec": { "*": { "null": "" } } } ]
内容的提问来源于stack exchange,提问作者Eric Farias
相关产品推荐
相关产品推荐

