基于JOLT的数组非空判断及PartySales对象生成问询
问题分析与JOLT规则调整方案
核心需求
- 仅当
PartySales.item数组已有其他元素时,才向数组中添加包含key.sourceKey的对象 - 若
PartySales.item数组为空,则输出JSON中不包含PartySales对象
输入JSON
{ "accountType": "MASTER", "AccountInfo": { "id": "1234", "mcaCountry": "CA", "accountRegion": "EMEA", "marketRegion": "EMEA" } }
现有JOLT转换规则的问题
- 冗余生成
partySalesKey字段,完全可以直接复用key字段 - 最后一个Shift操作会无条件向
PartySales.item插入key.sourceKey对象——即使原item数组为空,也会生成仅含该对象的数组,违反“仅当存在其他元素时才添加”的要求 - 当
AccountInfo无有效字段生成item元素时,仍会保留空的PartySales结构,不符合“空数组时移除PartySales”的规则
调整后的JOLT转换规则
[ // 生成key的基础片段 { "operation": "shift", "spec": { "*": "&", "accountType": { "MASTER": { "@2,AccountInfo.id": "key", "#Master": "key" }, "OPERATIONAL": { "@2,AccountInfo.id": "key", "#~": "key" } } } }, // 拼接key为sourceKey格式 { "operation": "modify-overwrite-beta", "spec": { "key": "=join(~,@(1,&))" } }, // 生成PartySales的基础item元素(集中到数组第一个位置) { "operation": "shift", "spec": { "AccountInfo": { "accountRegion": { "AMER": { "#0001": "PartySales.item[0].IbxRegionCd.RegionCd", "#AMER": "PartySales.item[0].IbxRegionCd.RegionDesc" }, "APAC": { "#0002": "PartySales.item[0].IbxRegionCd.RegionCd", "#APAC": "PartySales.item[0].IbxRegionCd.RegionDesc" }, "EMEA": { "#0003": "PartySales.item[0].IbxRegionCd.RegionCd", "#EMEA": "PartySales.item[0].IbxRegionCd.RegionDesc" } }, "mcaCountry": { "@1,mcaCountry": [ "PartySales.item[0].McaCntryCd.cntryCd", "PartySales.item[0].McaCntryCd.cntryDesc" ] }, "marketRegion": { "AMER": { "@1,marketRegion": "PartySales.item[0].RegionCd.RegionDesc", "#0001": "PartySales.item[0].RegionCd.RegionCd" }, "APAC": { "@1,marketRegion": "PartySales.item[0].RegionCd.RegionDesc", "#0002": "PartySales.item[0].RegionCd.RegionCd" }, "EMEA": { "@2,marketRegion": "PartySales.item[0].RegionCd.RegionDesc", "#0003": "PartySales.item[0].RegionCd.RegionCd" } } }, "key": "&" } }, // 仅当PartySales.item存在元素时,添加sourceKey对象到数组末尾 { "operation": "shift", "spec": { "PartySales": { "item": { "*": "&2[&1]", "@2,key": "&2[#].key.sourceKey" } } } }, // 移除空的PartySales结构 { "operation": "remove", "spec": { "PartySales": { "item": { "": { "@(2)": "" } } } } } ]
调整说明
- 移除冗余的
partySalesKey字段,直接使用生成好的key字段 - 固定基础
item元素的索引为0,确保所有基础字段集中在一个对象中 - 通过
@2,key的引用逻辑,仅在PartySales.item已有元素时,才将key作为新元素插入数组 - 最后一步Remove操作检查
item数组是否为空,为空则直接移除整个PartySales对象,完全符合需求
内容的提问来源于stack exchange,提问作者Madhavi kurabalakota
相关产品推荐
相关产品推荐

