Нужна помощь в Dataweave - PullRequest
       9

Нужна помощь в Dataweave

2 голосов
/ 30 апреля 2020

Может ли кто-нибудь помочь мне в преобразовании этого потока данных в целевой формат? в основном конвертировать элементы в массив.

Я даже начал, но не уверен, что делать дальше. любые предложения будут полезны

  payload mapObject(order,key,index) -> {

         ((key):order) if ! (key  contains "Item_"),
    }

ввод:

{
    "id": "1",
    "Item_1_ID": "43-583-0978",
    "Item_1_Name": "Sodium Chloride",
    "Item_1_Quantity": "26",
    "Item_1_Price": "802.41",
    "Item_2_ID": "71-788-5293",
    "Item_2_Name": "Ciprofloxacin",
    "Item_2_Quantity": "100",
    "Item_2_Price": "608.64",
   }

вывод:

{
    "id": "1",
    Items:[{
        "ID":"43-583-0978",
        "Name": "Sodium Chloride",
        "Price": "802.41",
        "Quantity": "26",
    },
    {
        "ID":"71-788-5293",
        "Name": "Ciprofloxacin",
        "Price": "100",
        "Quantity": "608.64",
    }]

  }

1 Ответ

3 голосов
/ 30 апреля 2020

Здесь у вас есть решение проблемы, которую вы запросили. Он использует некоторое регулярное выражение для извлечения частей ключа, а затем функции groupBy и pluck для группировки по номеру Id и pluck для преобразования результата groupBy в массив и преобразования ключей.

%dw 2.0
output application/json
fun getItemNumber(keyName:String) = 
    (keyName scan /Item_(\d+)/)[0][1]

fun getKeyName(keyName:String) = 
    (keyName scan /Item_[\d+]_(.*)/)[0][1]    
---
{
    "Id" : payload.id,
    "Item": (payload - "id") 
                groupBy ((value, key) -> //Group it by ID
                            getItemNumber(key as String)
                        ) 
                pluck ((value, key, index) -> //Go through all the values of the groups and take the real keys
                        value mapObject ((value, key, index) -> {
                            (getKeyName(key)): value
                        })
                    )        
}
...