Групповой ключевой сегмент в Dataweave 1.0 - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующее требование для DataWeave в Mule ESB 3.8.4, где shipDate_n, shipMethod_n и trackingNumber_n будут изменяться от 1 до n во входной полезной нагрузке.Мне нужно сгруппировать данные по номеру после подчеркивания в ключе:

Ввод полезной нагрузки:

[{
    "shipDate_1": "2010-01-11T07:00:00Z",
    "shipDate_2": "2010-02-11T07:00:00Z",
    "shipDate_3": "2010-03-11T07:00:00Z",
    "shipMethod_1": "UPS1 Ground",
    "shipMethod_2": "UPS2 Ground",
    "shipMethod_3": "UPS3 Ground",
    "trackingNumber_1": "1",
    "trackingNumber_2": "2",
    "trackingNumber_3": "3"
}]

Требуемый вывод:

[{
    "trackingInfo": [{
            "trackingNbr": "1",
            "shipMethod": "UPS1 Ground",
            "shipDate": "2010-01-11T07:00:00Z"
        },
        {
            "trackingNbr": "2",
            "shipMethod": "UPS2 Ground",
            "shipDate": "2010-02-11T07:00:00Z"
        },
        {
            "trackingNbr": "3",
            "shipMethod": "UPS3 Ground",
            "shipDate": "2010-03-11T07:00:00Z"
        }
    ]
}]

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать метод pluck для подсчета количества полей, скажем n, а затем итерации для n/3 раз и динамического формирования ключей для получения данных из ввода.Следующий код работал для данного ввода

Код

%dw 1.0
%output application/json
%var data = payload[0]
%var dataSet = (sizeOf (data pluck $$ )) / 3
%var startIndex = 1
---
[trackingInfo : [ startIndex[0] .. dataSet] map {
    "trackingNbr": data[("trackingNumber_" ++ $)],
    "shipMethod":data[("shipMethod_" ++ $)],
    "shipDate": data[("shipDate_" ++ $)]
}]

Вход-

[
    {
        "shipDate_1": "2010-01-11T07:00:00Z",
        "shipDate_2": "2010-02-11T07:00:00Z",
        "shipMethod_1": "UPS1 Ground",
        "shipMethod_2": "UPS2 Ground",
        "trackingNumber_1": "1",
        "trackingNumber_2": "2"
    }
]

Выход-

[
  {
    "trackingInfo": [
      {
        "trackingNbr": "1",
        "shipMethod": "UPS1 Ground",
        "shipDate": "2010-01-11T07:00:00Z"
      },
      {
        "trackingNbr": "2",
        "shipMethod": "UPS2 Ground",
        "shipDate": "2010-02-11T07:00:00Z"
      }
    ]
  }
]

Другой способ основан на подсчетеtrackingNumber полей, присутствующих на входе

%dw 1.0
%output application/json
%var data = payload[0]
%var dataSet =  sizeOf ((data pluck $$ ) filter ($ contains "trackingNumber"))
%var startIndex = 1
---
[trackingInfo : [startIndex[0] .. dataSet] map {
    "trackingNbr": data[("trackingNumber_" ++ $)],
    "shipMethod":data[("shipMethod_" ++ $)],
    "shipDate": data[("shipDate_" ++ $)]
}]

HTH

...