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

如何基于嵌套字段值通过JOLT修改eventType字段值?

JOLT转换需求:根据嵌套字段值修改eventType

我们的服务接收JSON数据,需通过JOLT工具转换结构后发送给第三方API。现有转换逻辑已实现基础结构转换,但需新增需求:当嵌套字段...itemSelectionDetails.extSelectionDetails.isP1Customer的值为true时,将requests数组和retryConfigRequestMap中的eventType修改为cartSaleEvent.PREMIUM;若该字段为false或不存在,则保持原有值。

源JSON

{
  "id": "wert23sd-0891-4fcd-ae31-380c0ef61198",
  "topic": "cartsaleOmni/sale",
  "subject": "EventTypeEvent.Cart.Sale",
  "data": {
    "payload": {
      "content": {
        "cartEvent": {
          "eventOccurrenceTime": "2023-01-12T03:09:42.254Z",
          "cartEventId": "fe9c22ca-dc38-4bcd-a220-c7425b9bed7e",
          "eventTriggerTime": "2023-01-12T02:38:43.609Z",
          "eventName": "Sale Cart",
          "cart": {
            "cartId": "be8b22ba-dc38-4bcd-a120-c7425b9bed7e",
            "cartLineItems": [
              {
                "itemId": "44e610ab-c209-4232-8bb4-51f7b9b13a75",
                "cartLineItemId": "fe9c22ca-23ad-46e0-8629-a6593597f183",
                "startsAt": "2023-01-16",
                "endsAt": "2023-01-19",
                "numberOfUnits": 2,
                "clientChannel": "web",
                "clientSource": "mgmri",
                "itemSelectionDetails": {
                  "extSelectionDetails": {
                    "isP1Customer": true
                  }
                },
                "eventType": "saleEvent.44e610ab-c209-4232-8bb4-51f7b9b13a75"
              }
            ]
          }
        }
      }
    }
  },
  "customerId": "CORP11A38249"
}

当前JOLT配置

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "payload": {
          "content": {
            "cartEvent": {
              "cart": {
                "cartLineItems": {
                  "*": {
                    "eventType": "=concat('carteSaleEvent.', @(1,itemId))"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "customerId": "requests[0].payload.context.CustomerID",
      "data": {
        "payload": {
          "content": {
            "cartEvent": {
              "cart": {
                "cartId": "referenceNumber",
                "cartLineItems": {
                  "*": {
                    "eventType": "requests[0].eventType",
                    "$": "retryConfigRequestMap.@eventType.maxAttempts",
                    "itemId": "requests[0].payload.context.itemId",
                    "numberOfUnits": "requests[0].payload.context.noOfUnits",
                    "startsAt": "requests[0].payload.context.earliestDate",
                    "endsAt": "requests[0].payload.context.latestDate"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "retryConfigRequestMap": {
        "*": {
          "altEventName": "cartSaleComplete",
          "enabled": true
        }
      }
    }
  },
  {
    "operation": "default",
    "spec": {
      "eventType": "Cart.Sale.Complete"
    }
  }
]

当前输出JSON

{
  "eventType": "Cart.Sale.Complete",
  "referenceNumber": "be8b22ba-dc38-4bcd-a120-c7425b9bed7e",
  "requests": [
    {
      "eventType": "carteSaleEvent.44e610ab-c209-4232-8bb4-51f7b9b13a75",
      "payload": {
        "context": {
          "CustomerID": "CORP11A38249",
          "earliestDate": "2023-01-16",
          "itemId": "44e610ab-c209-4232-8bb4-51f7b9b13a75",
          "latestDate": "2023-01-19",
          "noOfUnits": 2
        }
      }
    }
  ],
  "retryConfigRequestMap": {
    "carteSaleEvent.44e610ab-c209-4232-8bb4-51f7b9b13a75": {
      "altEventName": "cartSaleComplete",
      "enabled": true,
      "maxAttempts": "0"
    }
  }
}

期望输出JSON

{
  "eventType": "Cart.Sale.Complete",
  "referenceNumber": "be8b22ba-dc38-4bcd-a120-c7425b9bed7e",
  "requests": [
    {
      "eventType": "carteSaleEvent.PREMIUM",
      "payload": {
        "context": {
          "CustomerID": "CORP11A38249",
          "earliestDate": "2023-01-16",
          "itemId": "44e610ab-c209-4232-8bb4-51f7b9b13a75",
          "latestDate": "2023-01-19",
          "noOfUnits": 2
        }
      }
    }
  ],
  "retryConfigRequestMap": {
    "carteSaleEvent.PREMIUM": {
      "altEventName": "cartSaleComplete",
      "enabled": true,
      "maxAttempts": "0"
    }
  }
}

解决方案

核心思路

  1. 在modify-overwrite-beta阶段提取isP1Customer状态,生成判断后的最终eventType
  2. 在shift阶段将最终eventType同步映射到requests和retryConfigRequestMap的键名
  3. 清理临时字段,保证输出结构干净

完整JOLT配置

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "payload": {
          "content": {
            "cartEvent": {
              "cart": {
                "cartLineItems": {
                  "*": {
                    // 保留原逻辑的拼接值
                    "originalEventType": "=concat('carteSaleEvent.', @(1,itemId))",
                    // 提取isP1Customer状态,不存在则默认视为false
                    "isP1Customer": "@(1,itemSelectionDetails.extSelectionDetails.isP1Customer)",
                    // 根据状态生成最终eventType
                    "finalEventType": "=ifElse(@(1,isP1Customer), 'carteSaleEvent.PREMIUM', @(1,originalEventType))"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "customerId": "requests[0].payload.context.CustomerID",
      "data": {
        "payload": {
          "content": {
            "cartEvent": {
              "cart": {
                "cartId": "referenceNumber",
                "cartLineItems": {
                  "*": {
                    "finalEventType": ["requests[0].eventType", "tempEventType"],
                    "$": "retryConfigRequestMap.@(1,finalEventType).maxAttempts",
                    "itemId": "requests[0].payload.context.itemId",
                    "numberOfUnits": "requests[0].payload.context.noOfUnits",
                    "startsAt": "requests[0].payload.context.earliestDate",
                    "endsAt": "requests[0].payload.context.latestDate"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "retryConfigRequestMap": {
        "*": {
          "altEventName": "cartSaleComplete",
          "enabled": true
        }
      },
      // 清理临时字段
      "tempEventType": ""
    }
  },
  {
    "operation": "default",
    "spec": {
      "eventType": "Cart.Sale.Complete"
    }
  }
]

配置说明

  1. 第一个modify阶段:

    • 生成originalEventType:保留原有拼接逻辑的结果,作为非Premium用户的默认值
    • 提取isP1Customer:从嵌套字段获取状态,字段不存在时JOLT会自动设为null,ifElse会将其判定为false
    • 生成finalEventType:通过ifElse函数完成分支判断,输出最终的eventType值
  2. shift阶段:

    • 将finalEventType同时映射到requests[0].eventType和临时字段,确保retryConfigRequestMap的键名能正确关联最终值
    • 用@(1,finalEventType)作为retryConfigRequestMap的键,直接同步最终eventType
  3. 第二个modify阶段:

    • 保留原有的retryConfig配置逻辑
    • 清空临时字段tempEventType,避免污染输出结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:15:35