Как я могу преобразовать массив объектов в массив строк и не потерять ключ в Dataweave? - PullRequest
0 голосов
/ 30 октября 2018

Привет, мне нужно преобразовать следующий объект JSON:

{
  "products": [
    {
      "itemno": "123131",
      "description" : "Big Widget",
      "attributes": [
        {
          "color": [
            {
              "value": "Red",
              "codeValue": "RED_NO2"
            },
            {
              "value": "Blue Licorice",
              "codeValue": "BLUE-355"
            }
          ]
        },
        {
          "chemicals": [
            {
              "value": "Red Phosphorous",
              "codeValue": "RED_PHOS"
            },
            {
              "value": "Chlorine Bleach",
              "codeValue": "CHLRN_BLCH"
            }
          ]
        }
      ]
    }
  ]
}

Я пытаюсь преобразовать это с каждым атрибутом, имеющим массив значений, где их значением является codeValue, а это массив этих строковых значений.

Это желаемый результат:

{
  "products": [
    {
      "itemno": "123131",
      "description: : "Big Widget",
      "attributes": [
        {
          "color": ["RED_NO2", "BLUE-355"]
        },
        {
          "chemicals": ["RED_PHOS", "CHLRN_BLCH"]
        }
      ]
    }
  ]
}

Это Dataweave. Я не могу определить, как получить имена атрибутов (например, цвет, химикаты в качестве ключей с нужными данными.

Существует не так много хороших примеров преобразования данных с помощью Dataweave, и я потратил много времени, пытаясь это выяснить.

Это один из потоков данных, который несколько попал туда, но не является решением:

%dw 1.0
%output application/json
---
payload.products map 
{
    "ItemNo" : $.sku,
    "Desc" : $.description,
    "Test" : "Value",
    "Attributes" : $.attributes map
    {
        '$$' : $ pluck $.value
    }
}

Ваша помощь очень ценится.

1 Ответ

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

Вы можете сделать что-то вроде этого:

%dw 1.0
%output application/json

%function attributeCodeValues(attributes)
  attributes map ((attr) -> 
    attr mapObject ((values, descriptor) ->
      {
        (descriptor): values map $.codeValue
      }
    )
  )
---
payload.products map {
    "ItemNo" : $.sku,
    "Desc" : $.description,
    "Test" : "Value",
    "Attributes" : attributeCodeValues($.attributes)
}
...