簡體   English   中英

JOLT 轉換:根據嵌套元素中的值更改字段值

[英]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變量:

如果isP1CustomertruecarteSaleEvent.PREMIUM

如果isP1CustomerfalseeventType值。

最后,您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM