基于Jolt实现主对象无对应属性时从次对象引入属性
Jolt配置修正:仅当Account无对应属性时从SystemResponse补充字段
需求说明
要实现:只有Account.AccountInfo里没有的属性,才从SystemResponse映射过来并转换格式:
SystemResponse.serviceFlag→Account.AccountInfo.isService(原Account无此属性,需添加,"true"转1,"false"转0)SystemResponse.resellerFlag→Account.AccountInfo.isReseller(原Account已有该属性,忽略)SystemResponse.poRequiredFlag→Account.AccountInfo.poRequired(原Account已有该属性,忽略)
输入JSON
{ "Account": { "AccountInfo": { "isReseller": 10, "poRequired": 10 } }, "SystemResponse": { "resellerFlag": "false", "poRequiredFlag": "false", "serviceFlag": "true" } }
原有配置的问题
- 属性存在性判断逻辑错误:用
@Account.AccountInfo.isService这种路径判断时,属性不存在就取不到值,导致后续赋值逻辑完全不触发 - 路径写错:
resellerFlag的处理错误指向了partyAccount.eqxAccountInfo.isReseller,和目标路径不符 - 条件逻辑颠倒:现有配置是先判断
serviceFlag的值,再检查属性是否存在;正确逻辑应该是先检查属性是否不存在,再根据serviceFlag赋值
修正后的Jolt配置
[ // 第一步:完整保留原Account的所有属性 { "operation": "shift", "spec": { "Account": "Account" } }, // 第二步:仅当目标属性不存在时,从SystemResponse取值并转换 { "operation": "default", "spec": { "Account": { "AccountInfo": { // 当isService不存在时,把serviceFlag的字符串转成数字 "isService": "${SystemResponse.serviceFlag:true:1,false:0}" } } } }, // 第三步:清理掉不需要的SystemResponse对象 { "operation": "remove", "spec": { "SystemResponse": "" } } ]
配置逻辑解释
- shift操作:先把原Account完整保留下来,确保已有属性
isReseller、poRequired不丢失 - default操作:Jolt的
default操作天生就是用来处理「属性不存在时才赋值」的场景,完全匹配需求。这里用${}变量语法,把SystemResponse.serviceFlag的字符串值映射成数字:"true"对应1,"false"对应0 - remove操作:把输入里的
SystemResponse删掉,让输出更干净
最终输出(符合预期)
{ "Account" : { "AccountInfo" : { "isReseller" : 10, "poRequired" : 10, "isService" : 1 } } }
内容的提问来源于stack exchange,提问作者Rakesh GR
相关产品推荐
相关产品推荐

