You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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,&))"
      }
    }
  }
]

规则说明

  1. 分支路由阶段:通过success的true/false值,将成功、失败场景的数据分别映射到success_branch和error_branch节点,避免两种逻辑互相干扰。使用@(2,message)和@(2,data)向上两层引用根节点的对应字段,保证数据正确传递。
  2. 分支合并阶段:将有效分支的内容直接提升到根节点,不符合当前success值的分支会被自动忽略,不会产生冗余数据。
  3. 数据修正阶段:modify-overwrite-beta只会对存在的字段生效,成功场景下error_message不存在则不会执行拼接,失败场景下good_id不存在则不会执行类型转换,不会出现null或无效操作。

验证效果

  • 输入成功响应时,输出结构与原Success spec结果完全一致;
  • 输入失败响应时,输出结构与原Error spec结果完全一致,无null值问题。

内容的提问来源于stack exchange,提问作者caputz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:55:13