Jolt执行shift转换时如何避免自动生成数组,保留最后匹配值?
Jolt多字段映射同一键避免生成数组的配置方案
现有输入JSON如下:
{ "foo": "bar", "tuna": "marlin" }
最初使用的Jolt spec配置如下:
[ { "operation": "shift", "spec": { "foo": "baz", "tuna": "baz" } } ]
转换后输出的baz字段为数组类型,不符合需求:
{ "baz" : [ "bar", "marlin" ] }
预期实现:baz字段取最后一个匹配的字段值,不生成数组,效果如下:
{ "baz" : "marlin" }
解决方案
出现数组的原因是shift操作的默认规则:当多个输入字段映射到同一个输出键时,会自动将所有匹配值打包为数组。要实现后值覆盖前值的效果,可在原配置基础上新增一步modify-overwrite-beta操作,提取数组最后一个元素即可,调整后的spec如下:
[ { "operation": "shift", "spec": { "foo": "baz", "tuna": "baz" } }, { "operation": "modify-overwrite-beta", "spec": { "baz": "=lastElement(@(1,baz))" } } ]
逻辑说明
- 第一步
shift操作保留原有映射逻辑,将foo和tuna的取值汇总到baz字段生成数组 - 第二步
modify-overwrite-beta操作调用Jolt内置的lastElement函数,读取baz数组的最后一个元素,直接覆盖原数组类型的baz值,最终得到单值类型的输出结果。如果业务场景中tuna优先级高于foo,该配置同时适配tuna不存在、自动取foo值的场景。
内容的提问来源于stack exchange,提问作者Markus Ridziauskas
相关产品推荐
相关产品推荐

