如何根据REST请求成功状态合并JOLT转换规则?
问题描述
调用REST Web服务时,服务会根据请求成功与否返回不同格式的响应:
成功响应(Input 1)
{"success": true,"data": {"series": "XX/32/V32/LM","number": 242,"end_date": "31/12/2023","premium": "2309.68","premium_net": "2286.58","total_premium": 2494.46,"commission": 1,"installments": [{"number": 1,"due_date": "30/12/2022","value": "2494.46","currency": "RON"}],"reference_premium": 1061,"direct_settlement_cover": 1,"direct_settlement": 184.78,"direct_settlement_net": 182.93,"bm": "B0","exclusion_countries": ["BY","IL","IR","MA","RUS","TN","UA"]},"message": "Polița a fost emisă cu succes"}
失败响应(Input 2)
{"success": false,"message": "Eroare validare date","data": {"pay_document": ["Trebuie să menționați modalitatea de plată"]}}
已编写适配两种场景的JOLT转换规则:
成功场景规则(Success spec)
[{"operation": "shift","spec": {"message": "body.info_message","data": {"#1": "body.good_id","series": "body.policy_series","number": "body.policy_number","end_date": "body.policy_end_date","direct_settlement_cover": {"1": {"#Decontare directa": "clauses[0].clause_name","#1": "clauses[0].clause_id"}},"direct_settlement": "clauses[0].premium","installments": {"*": {"number": "body.installments[&1].number","value": "body.installments[&1].amount","currency": "body.installments[&1].currency","due_date": "body.installments[&1].due_date"}}}}},{"operation": "modify-overwrite-beta","spec": {"body": {"good_id": "=toInteger"}}}]
失败场景规则(Error spec)
[{"operation": "shift","spec": {"message": "body.info_message","data": {"*": {"*": "body.error_message"}}}},{"operation": "modify-overwrite-beta","spec": {"*": {"error_message": "=join(' | ',@(1,&))"}}}]
现在需要将两个规则合并,实现当success为false时输出错误信息,为true时返回待保存的模型结构,但尝试将success字段加入转换逻辑后始终返回null,求该场景下的最佳实践。
解决方案
要实现基于success字段的分支转换,核心是利用JOLT的条件路由能力,通过shift操作中的success字段值区分处理逻辑,合并后的规则如下:
[ // 第一步:根据success值做分支路由,将对应数据暂存到不同节点 { "operation": "shift", "spec": { "success": { "true": { "@(2,message)": "success_branch.body.info_message", "@(2,data)": { "#1": "success_branch.body.good_id", "series": "success_branch.body.policy_series", "number": "success_branch.body.policy_number", "end_date": "success_branch.body.policy_end_date", "direct_settlement_cover": { "1": { "#Decontare directa": "success_branch.clauses[0].clause_name", "#1": "success_branch.clauses[0].clause_id" } }, "direct_settlement": "success_branch.clauses[0].premium", "installments": { "*": { "number": "success_branch.body.installments[&1].number", "value": "success_branch.body.installments[&1].amount", "currency": "success_branch.body.installments[&1].currency", "due_date": "success_branch.body.installments[&1].due_date" } } } }, "false": { "@(2,message)": "error_branch.body.info_message", "@(2,data)": { "*": { "*": "error_branch.body.error_message" } } } } } }, // 第二步:合并分支,只保留有效分支的数据 { "operation": "shift", "spec": { "success_branch": "*", "error_branch": "*" } }, // 第三步:统一处理数据修正,仅对存在的字段生效 { "operation": "modify-overwrite-beta", "spec": { "body": { "good_id": "=toInteger", "error_message": "=join(' | ',@(1,&))" } } } ]
规则说明
- 分支路由阶段:通过
success的true/false值,将成功、失败场景的数据分别映射到success_branch和error_branch节点,避免两种逻辑互相干扰。使用@(2,message)和@(2,data)向上两层引用根节点的对应字段,保证数据正确传递。 - 分支合并阶段:将有效分支的内容直接提升到根节点,不符合当前
success值的分支会被自动忽略,不会产生冗余数据。 - 数据修正阶段:
modify-overwrite-beta只会对存在的字段生效,成功场景下error_message不存在则不会执行拼接,失败场景下good_id不存在则不会执行类型转换,不会出现null或无效操作。
验证效果
- 输入成功响应时,输出结构与原Success spec结果完全一致;
- 输入失败响应时,输出结构与原Error spec结果完全一致,无null值问题。
内容的提问来源于stack exchange,提问作者caputz
相关产品推荐
相关产品推荐

