如何在Jolt转换输出中移除空对象contactEnrichment
解决Jolt中移除空/不存在的contactEnrichment字段问题
问题场景
当前Jolt转换后,无论输入JSON是否包含contactEnrichment字段,或是该字段为空对象,输出始终保留"contactEnrichment": {}。需求是:当该字段不存在或为空对象时,直接从输出JSON中移除它。
解决方案:使用Shift操作实现条件保留
通过Jolt的shift操作,可以仅在contactEnrichment包含子字段时才保留该字段,空对象或不存在的情况则自动省略。
示例Jolt Spec
[ { "operation": "shift", "spec": { // 映射其他需要保留的字段,"*": "&" 表示原样保留所有其他字段 "*": "&", "contactEnrichment": { // 仅当contactEnrichment下存在至少一个子字段时,才触发映射 "*": { "@2": "contactEnrichment" } } } } ]
原理说明
*: "&"是默认字段映射规则,确保除contactEnrichment外的其他字段正常保留。- 针对
contactEnrichment的嵌套规则:"*"会匹配该对象下的所有子字段,只有当存在子字段时,@2才会将整个contactEnrichment对象映射到输出中;如果是空对象或输入中无此字段,则不会生成contactEnrichment字段。
测试验证
- 输入为空对象的情况
{ "contactEnrichment": {} }
输出:
{}
- 输入包含有效内容的情况
{ "contactEnrichment": { "email": "test@example.com" }, "userId": 123 }
输出:
{ "contactEnrichment": { "email": "test@example.com" }, "userId": 123 }
- 输入无contactEnrichment字段的情况
{ "userId": 123 }
输出:
{ "userId": 123 }
备选方案:使用Modify+Remove组合
如果你的场景更适合用modify操作,可以通过判断字段是否为空来移除:
[ { "operation": "modify-overwrite-beta", "spec": { // 用size函数获取contactEnrichment的子字段数量 "__tempSize": "=size(@(1,contactEnrichment))" } }, { "operation": "remove", "spec": { // 当子字段数量为0时移除contactEnrichment "contactEnrichment": { "$[#__tempSize == 0]": "" }, // 清理临时字段 "__tempSize": "" } } ]
内容的提问来源于stack exchange,提问作者Sanskar
相关产品推荐
相关产品推荐

