如何修复Jolt移除JSON空值时出现的重复数组问题
解决Jolt转换中Adjustment字段重复的问题
需求与输入
输入JSON数据:
[ { "Type": "MOBILE_ADJUSTMENT", "MobileAdjustment": { "BidModifier": 110, "OperatingSystemType": "IOS" }, "DesktopAdjustment": null, "SmartTvAdjustment": null } ]
需求:移除所有null值的字段,仅保留Adjustment相关字段,并添加默认值AdGroupId: 1。
原尝试的Jolt规范及问题
使用以下Jolt规范后,转换结果出现MobileAdjustment数组重复的问题:
[ { "operation": "default", "spec": { "*": { "*": "NULLS" } } }, { "operation": "shift", "spec": { "*": { "*": { "NULLS": null, "*": { "@1": "&2" } } } } }, { "operation": "default", "spec": { "AdGroupId": 1 } }, { "operation": "shift", "spec": { "*Adjustment": "&", "AdGroupId": "AdGroupId" } } ]
错误转换结果:
{ "AdGroupId": 1, "MobileAdjustment": [ { "BidModifier": 110, "OperatingSystemType": "IOS" }, { "BidModifier": 110, "OperatingSystemType": "IOS" } ] }
预期结果:
{ "AdGroupId": 1, "MobileAdjustment": [ { "BidModifier": 110, "OperatingSystemType": "IOS" } ] }
问题原因
原规范中第一个shift操作逻辑冗余且错误:遍历数组元素下的所有字段时,处理MobileAdjustment的子字段时,@1会将整个MobileAdjustment对象再次映射到外层的&2(即MobileAdjustment字段),加上原本的对象,导致数组元素重复。此外,前置的default操作给所有字段设置NULLS默认值完全多余,反而增加了处理复杂度。
修改后的Jolt规范
直接简化逻辑,用shift过滤null字段,再添加默认值:
[ // 过滤保留非空的Adjustment字段 { "operation": "shift", "spec": { "*": { "*Adjustment": "&2" } } }, // 添加默认AdGroupId { "operation": "default", "spec": { "AdGroupId": 1 } } ]
解释
- shift操作:仅匹配并保留所有以
Adjustment结尾的非空字段,null值会被自动忽略,无需额外处理。 - default操作:为结果添加默认的
AdGroupId字段,值为1。
使用该规范转换后,即可得到预期的无重复字段的结果。
内容的提问来源于stack exchange,提问作者takotsubo
相关产品推荐
相关产品推荐

