首页 > 解决方案 > 使用 dataweave 从三/四个 json 数组列表生成所有可能的组合

问题描述

我正在研究骡子。在工作时,我遇到了一个场景,我想从传入的 JSON 数组列表(3-4 个数组对象)中生成所有可能的值组合。JSON 数组列表下的值是动态的。

我想以 JSON 格式生成输出。我只想使用数据编织来实现这一点。请帮助我如何使用 datawevae 在 mule 4 中实现这一点。

下面是我的 JSON 输入和所需的 JSON 输出。

注意:Json 数组列表是动态的。

输入 JSON 数组:

    {
  "airlines": [
    {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    }
  ],
  "hotels": [
    {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 600
    },
    {
      "hotelId": "f",
      "hotelName": "fdg",
      "hotelCost": 600
    }
  ],
  "cabs": [
    {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    }
  ]
}

输出:

    {
  "itenary 1": {
    "hotelDetails": {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 6000
    },
    "airlines": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 1700
    },"cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 8300
  },
  "itenary 2": {
    "hotelDetails": {
      "hotelId": "Mnva",
      "hotelName": "Minvera",
      "hotelCost": 1600
    },
    "airlines": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 1700
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 3900
  },
  "itenary 3": {
    "hotelDetails": {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 6000
    },
    "airlines": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 1600
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 8200
  },
  "itenary 4": {
    "hotelDetails": {
      "hotelId": "Mnva",
      "hotelName": "Minvera",
      "hotelCost": 1600
    },
    "airlines": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 1600
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 3800
  }
}

我可以使用 flatten 和 map 为 2 个数组对象编写数据编织代码,但没有更多的数组对象组合。

标签: muledataweavemule4mule-esb

解决方案


我很确定 Salim Khan 的答案更高效,但这里是 map and flatten 解决方案,以防它对任何人有用。



    %dw 2.0
    output application/json
    var hotelCount = sizeOf(payload.hotels)
    var cabCount = sizeOf(payload.cabs)
    fun itineraryNum(ia, ih, ic) = ia * hotelCount * cabCount + ih * cabCount + ic + 1
    
    ---
    flatten(flatten(
        payload.airlines map ((a, ia) -> 
            payload.hotels map ((h, ih ) -> 
                payload.cabs map ((c, ic) -> {
                    ("itinerary " ++ itineraryNum(ia, ih, ic) as String): {
                        hotelDetails: {
                            hotelId: h.hotelId,
                            hotelName: h.hotelName,
                            hotelCost: h.hotelCost
                        },
                        airlineDetails: {
                            airlineId: a.airlineId,
                            airlineName: a.airlineName,
                            airwayCost: a.airwayCost 
                        },
                        cabs: {
                            cabId: c.cabId,
                            cabName: c.cabName,
                            Cost: c.Cost
                        },
                        TripPackage: h.hotelCost + a.airwayCost + c.Cost
                    }
                }) 
            )
        )
    ))


推荐阅读