如何基于嵌套字段值通过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" } } }
解决方案
核心思路
- 在
modify-overwrite-beta阶段提取isP1Customer状态,生成判断后的最终eventType - 在
shift阶段将最终eventType同步映射到requests和retryConfigRequestMap的键名 - 清理临时字段,保证输出结构干净
完整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" } } ]
配置说明
第一个modify阶段:
- 生成
originalEventType:保留原有拼接逻辑的结果,作为非Premium用户的默认值 - 提取
isP1Customer:从嵌套字段获取状态,字段不存在时JOLT会自动设为null,ifElse会将其判定为false - 生成
finalEventType:通过ifElse函数完成分支判断,输出最终的eventType值
- 生成
shift阶段:
- 将
finalEventType同时映射到requests[0].eventType和临时字段,确保retryConfigRequestMap的键名能正确关联最终值 - 用
@(1,finalEventType)作为retryConfigRequestMap的键,直接同步最终eventType
- 将
第二个modify阶段:
- 保留原有的retryConfig配置逻辑
- 清空临时字段
tempEventType,避免污染输出结构
内容的提问来源于stack exchange,提问作者Vini
相关产品推荐
相关产品推荐

