[英]JOLT shift transformation: filter by the value of the property (not the name)
[英]JOLT Transformation: Change field value based on the value in a nested element
我有一個接收 JSON 的服務,需要在發送給第三方 API 之前將其轉換為不同的結構。我們的團隊在應用程序中使用JOLT進行轉換。 我在下面詳細說明了當前情況以及新問題。 新問題的問題是結果 JSON 中的元素/字段必須基於嵌套元素的值派生。 我花了幾個小時嘗試不同的操作(主要是 shift 和 modify-overwrite-beta),但未能找到解決方案。
來源 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"
}
}
]
當前 State Output 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"
}
}
}
現在,如果...itemSelectionDetails.extSelectionDetails.isP1Customer
retryConfigRequestMap
值為true
,我需要將requests
數組中的元素以及cartSaleEvent.PREMIUM
中的eventType
更改為 cartSaleEvent.PREMIUM 。 如果該字段設置為“false”或不存在,則保持不變。 所以所需的 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"
}
}
}
很抱歉這個冗長的問題。 我通讀了文檔和以下鏈接,但無法找到可行的解決方案。 任何幫助/指針將不勝感激。
您可以通過將"@(0,itemSelectionDetails.extSelectionDetails.isP1Customer)"
標識符與true
匹配,使用條件邏輯重新排列最后一個班次轉換規范,例如
{
"operation": "shift",
"spec": {
"customerId": "requests[0].payload.context.CustomerID",
"data": {
"payload": {
"content": {
"cartEvent": {
"cart": {
"cartId": "referenceNumber",
"cartLineItems": {
"*": {
"@(0,itemSelectionDetails.extSelectionDetails.isP1Customer)": {
"true": {
"#carteSaleEvent\\.PREMIUM": "requests[0].eventType",
"$2": "retryConfigRequestMap.carteSaleEvent\\.PREMIUM.maxAttempts"
},
"*": {
"@(2,eventType)": "requests[0].eventType",
"$2": "retryConfigRequestMap.@(3,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"
}
}
}
}
}
}
}
}
}
我們通過使用$2
、 "@(2,eventType)"
或"@(3,eventType)"
深入兩層(如右手邊所述,需要再遍歷一層)
順便說一句,如果屬性的順序很重要,那么您可以在結束方括號]
之前添加一個排序轉換規范,例如
,
{
"operation": "sort"
}
你可以使用這個規范:
我將您的所有操作移至一個shift
jolt 規范,並使用此值創建一個temp
變量:
如果isP1Customer
為true
: carteSaleEvent.PREMIUM
。
如果isP1Customer
為false
: eventType
值。
最后,您可以使用temp
值。
[
{
"operation": "modify-overwrite-beta",
"spec": {
"*": {
"*": {
"*": {
"*": {
"*": {
"*": {
"*": {
"eventType": "=concat('carteSaleEvent.', @(1,itemId))"
}
}
}
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"customerId": "requests[0].payload.context.CustomerID",
"#Cart.Sale.Complete": "eventType",
"data": {
"*": {
"*": {
"*": {
"cart": {
"cartId": "referenceNumber",
"cartLineItems": {
"*": {
"eventType": "temp",
"#test": "requests[&1].test",
"$": "retryConfigRequestMap.@eventType.maxAttempts",
"#cartSaleComplete": "retryConfigRequestMap.@eventType.altEventName",
"#true": "retryConfigRequestMap.@eventType.enabled",
"itemId": "requests[&1].payload.context.&",
"numberOfUnits": "requests[&1].payload.context.noOfUnits",
"startsAt": "requests[&1].payload.context.earliestDate",
"endsAt": "requests[&1].payload.context.latestDate",
"itemSelectionDetails": {
"*": {
"*": {
"true": {
"#carteSaleEvent.PREMIUM": "temp"
}
}
}
}
}
}
}
}
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"temp": "=lastElement"
}
},
{
"operation": "shift",
"spec": {
"eventType": "&",
"requests": {
"*": {
"*": "&2[&1].&",
"test": {
"@(4,temp)": "&3[&2].eventType"
}
}
},
"retryConfigRequestMap": {
"*": "&1.@(2,temp)"
}
}
}
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.