基于success字段的Jolt转换规则优化咨询
优化Jolt转换规则以适配success状态输出
我尝试了以下Jolt转换规则,但目前仅能显示message和error字段,其余字段无法正常输出。现需优化该规则,使其根据success字段的true/false状态生成符合要求的输出结构:
原Jolt转换规则
[ { "operation": "shift", "spec": { "response": { "success": { "true": { "#false": "error", "@(2,message)": "info_message", "series": "body.offer_series", "number": "body.offer_number", "end_date": "body.policy_end_date", "expiry_date": "body.offer_expiration_date", "commission": "body.commission.commission_amount", "premium_net": "body.premium.net_premium.amount", "total_premium": "body.premium.amount", "installments": { "*": { "number": "body.premium.installments[&1].number", "value": "body.premium.installments[&1].amount", "currency": "body.premium.installments[&1].currency", "due_date": "body.premium.installments[&1].due_date" } } }, "false": { "*": { "*": "body.error_message" } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "body": { "good_id": "=toInteger" } } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "error_message": "=join(' | ',@(1,&))" } } } ]
场景1:success=true
输入
{ "response": { "success": true, "data": { "series": "XX/32/V32/LM", "number": 8015, "end_date": "14/01/2024", "premium": 10192.05, "premium_net": 8969, "commission": 12, "installments": [ { "number": 1, "value": 11007.41, "currency": "RON", "due_date": "05/01/2023" } ], "total_premium": 11007.41, "reference_premium": 1994, "direct_settlement_cover": 1, "direct_settlement": 815.36, "direct_settlement_net": 717.52, "bm": "B0", "exclusion_countries": [ "BY", "IL", "IR", "MA", "RUS", "TN", "UA" ], "expiry_date": "04/02/2023", "appendix": false }, "message": "Oferta a fost emisă cu succes" } }
期望输出
{ "error" : "false", "body" : { "offer_series" : "XX/32/V32/LM", "offer_number" : 8015, "policy_end_date" : "14/01/2024", "offer_expiration_date" : "04/02/2023", "commission" : { "commission_amount" : 12 }, "premium" : { "net_premium" : { "amount" : 8969 }, "amount" : 11007.41, "installments" : [ { "number" : 1, "amount" : 11007.41, "currency" : "RON", "due_date" : "05/01/2023" } ] } } }
场景2:success=false
输入
{ "response": { "success": false, "message": "Eroare validare date", "data": { "driver.0.name": [ "Trebuie să menționați nume/denumire pentru șofer" ], "driver.1.name": [ "Trebuie să menționați nume/denumire pentru șofer" ], "driver.1tin": [ "CNP/CUI invalid pentru șofer" ], "vehicle.card": [ "Serie CIV invalidă pentru vehiculul asigurat" ] } } }
期望输出
{ "body" : { "info_message" : "Eroare validare date", "error_message" : "Trebuie să menționați nume/denumire pentru șofer | Trebuie să menționați nume/denumire pentru șofer | CNP/CUI invalid pentru șofer | Serie CIV invalidă pentru vehiculul asigurat" } }
优化后的Jolt转换规则
[ { "operation": "shift", "spec": { "response": { "success": { "true": { "#false": "error", "@(2,message)": "body.info_message", "@(2,data)": { "series": "body.offer_series", "number": "body.offer_number", "end_date": "body.policy_end_date", "expiry_date": "body.offer_expiration_date", "commission": "body.commission.commission_amount", "premium_net": "body.premium.net_premium.amount", "total_premium": "body.premium.amount", "installments": { "*": { "number": "body.premium.installments[&1].number", "value": "body.premium.installments[&1].amount", "currency": "body.premium.installments[&1].currency", "due_date": "body.premium.installments[&1].due_date" } } } }, "false": { "@(2,message)": "body.info_message", "@(2,data)": { "*": { "*": "body.error_message[]" } } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "body": { "error_message": "=join(' | ',@(1,&))" } } } ]
优化说明
- success=true分支修正:原规则未正确从
response.data下提取字段,优化后通过@(2,data)定位到数据层,确保所有业务字段能正确映射到目标结构。 - success=false分支调整:
- 将
response.message映射为body.info_message,符合输出要求; - 用
body.error_message[]收集所有错误信息数组,后续通过join合并为指定格式的字符串;
- 将
- 移除无用操作:删除了原规则中未用到的
good_id转换操作,精简规则逻辑。
内容的提问来源于stack exchange,提问作者caputz
相关产品推荐
相关产品推荐

