基于JSON字段的Jolt条件标记逻辑异常修复问询
问题描述
需要基于JSON字段推导userFlag,现有Jolt转换规范在处理特定输入时不符合预期,需排查修复。
推导规则
- 仅当
user为"internal"且source为"Facebook"时,userFlag为true - 若
user为null/空字符串,或source非"Facebook",则userFlag直接取internalAccount的值
现有问题
输入以下JSON时,实际输出userFlag为true,但预期应为false:
{"accountType":"Admin","accountInformation":{"user":"","source":"Facebook","internalAccount":false}}
测试场景
场景1
输入:
{ "accountType": "Admin", "accountInformation": { "user": "internal", "source": "Facebook", "internalAccount": "false" } }
预期输出:
{ "userFlag":true }
场景2
输入:
{ "accountType": "Admin", "accountInformation": { "user": "internal", "source": "Google", "internalAccount": "false" } }
预期输出:
{ "userFlag":false }
现有Jolt转换规范
[ { "operation": "shift", "spec": { "accountInformation": { "source": { "Facebook": { "#true": "sourceFlag" } }, "user": { "internal": { "#true": "userInternalFlag" } }, "internalAccount": "userFlag" } } }, { "operation": "modify-overwrite-beta", "spec": { "result": "=equals(@(1,sourceFlag),@(1,userInternalFlag))" } }, { "operation": "modify-overwrite-beta", "spec": { "userFlag": "=equals(@(1,result), 'true')" } }, { "operation": "modify-overwrite-beta", "spec": { "userFlag": "=toBoolean(@(1,userFlag))" } }, { "operation": "remove", "spec": { "sourceFlag": "", "userInternalFlag": "", "result": "" } } ]
问题分析与修复
问题根源
现有规范的shift步骤仅在user严格等于"internal"时才生成userInternalFlag,当user为空字符串时,userInternalFlag为null,后续的equals(null, true)判断逻辑出现偏差,导致错误覆盖internalAccount的值。
修复后的Jolt规范
[ { "operation": "shift", "spec": { "accountInformation": { "user": "userVal", "source": "sourceVal", "internalAccount": "userFlag" } } }, { "operation": "modify-overwrite-beta", "spec": { "isValid": "=and(=equals(@(1,userVal), 'internal'), =equals(@(1,sourceVal), 'Facebook'))" } }, { "operation": "modify-overwrite-beta", "spec": { "userFlag": "=if(@(1,isValid), true, @(1,userFlag))" } }, { "operation": "modify-overwrite-beta", "spec": { "userFlag": "=toBoolean(@(1,userFlag))" } }, { "operation": "remove", "spec": { "userVal": "", "sourceVal": "", "isValid": "" } } ]
修复说明
- Shift步骤:直接提取
user、source和internalAccount的原始值,避免仅匹配特定字符串导致的字段缺失 - 有效性判断:通过
and与equals组合,精准判断是否同时满足user="internal"和source="Facebook"的条件 - 赋值逻辑:若条件满足则将
userFlag设为true,否则保留internalAccount的原始值 - 类型统一:将
userFlag转为布尔类型,兼容internalAccount为字符串或布尔值的情况 - 临时字段清理:移除用于判断的临时字段,仅保留最终结果
userFlag
内容的提问来源于stack exchange,提问作者Rakesh GR
相关产品推荐
相关产品推荐

