JOLT大小写不敏感包含匹配转换报错问题排查与需求实现
解决JOLT转换报错并实现需求的JSON转换逻辑
问题分析
原JOLT Spec报错的原因是Shift操作中错误使用|组合多个匹配模式,JOLT不支持这种语法。同时原逻辑也不符合需求——需求要求同时匹配两组关键词,而非单个关键词匹配。
正确的JOLT转换规则
[ // 1. 统一转为小写,消除大小写敏感问题 { "operation": "modify-overwrite-beta", "spec": { "type": "=toLower", // 标记是否包含mnl/manual类关键词 "hasManual": "=contains(@(1,type), 'mnl') ||=contains(@(1,type), 'manual')", // 标记是否包含credit "hasCredit": "=contains(@(1,type), 'credit')", // 标记是否包含debit "hasDebit": "=contains(@(1,type), 'debit')" } }, // 2. 根据标记字段的组合设置最终type值 { "operation": "shift", "spec": { // 同时包含manual类关键词和credit "hasManual": { "true": { "@(2,hasCredit)": { "true": { "#MANUAL_CREDIT": "type" } } } }, // 同时包含manual类关键词和debit "hasManual": { "true": { "@(2,hasDebit)": { "true": { "#MANUAL_DEBIT": "type" } } } }, // 默认匹配所有其他场景 "*": { "#MANUAL_PAYMENT": "type" } } }, // 3. 清理辅助标记字段(可选,按需保留) { "operation": "remove", "spec": { "hasManual": "", "hasCredit": "", "hasDebit": "" } } ]
规则说明
Modify阶段:
- 将
type转为全小写,统一匹配规则 - 新增三个布尔辅助字段,分别标记
type是否包含目标关键词组
- 将
Shift阶段:
- 优先匹配
hasManual=true且hasCredit=true的场景,输出MANUAL_CREDIT - 其次匹配
hasManual=true且hasDebit=true的场景,输出MANUAL_DEBIT - 最后用通配符
*兜底,输出默认值MANUAL_PAYMENT
- 优先匹配
Remove阶段:
- 删除辅助标记字段,仅保留最终的
type结果
- 删除辅助标记字段,仅保留最终的
测试验证
- 输入:
{"type": "my Mnl"}→ 输出:{"type": "MANUAL_PAYMENT"} - 输入:
{"type": "Credit mnl String"}→ 输出:{"type": "MANUAL_CREDIT"} - 输入:
{"type": "My Manual Debit"}→ 输出:{"type": "MANUAL_DEBIT"} - 输入:
{"type": "random string"}→ 输出:{"type": "MANUAL_PAYMENT"}
内容的提问来源于stack exchange,提问作者Prasad S Deshpande
相关产品推荐
相关产品推荐

