Dataweave 1.0 Добавить товары в массив - PullRequest
2 голосов
/ 13 апреля 2020

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

{
  "ID": "72a6dcc0",
  "SourceCode": "ABC",
  "TargetCode": "DEF",
  .
  .
  .
  .
  .
  "Products": [
    {
      "ProdId": "410ef294",
      "ProdDetails": {
        "ProdIdentifier": "410ef294-e80b",
        "DateFrom": "2019-01-01T00:00:00Z",
        "DateTo": "9999-12-31T00:00:00Z",
        "ProductName": "ProdA"
      }
    }
  ]
}

Мне нужно добавить новый атрибут «ProdDescription» в массив «Products», чтобы мои выходные данные выглядели так:

{
  "ID": "72a6dcc0",
  "SourceCode": "ABC",
  "TargetCode": "DEF",
  .
  .
  .
  .
  .
  "Products": [
    {
      "ProdId": "410ef294",
      "ProdDetails": {
        "ProdIdentifier": "410ef294-e80b",
        "DateFrom": "2019-01-01T00:00:00Z",
        "DateTo": "9999-12-31T00:00:00Z",
        "ProductName": "ProdA",
        "ProdDescription": "This is a Sample"
      }
    }
  ]
}

Полезная нагрузка, которую я дал, является только примером и имеет сотни атрибутов. Мне нужно только добавить новые атрибуты в массив «Продукты», а также сохранить другие элементы в основной полезной нагрузке. Можно ли сделать полную «карту» полезной нагрузки и добавить в массив новый атрибут, используя «mapobject»? Я нахожусь на dataweave 1.0

1 Ответ

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

Самый простой способ сделать это - удалить запись «Product» с помощью оператора «-», а затем добавить новую запись «Product» с помощью «++» для добавления нового элемента в массив, используя «+» operator

Итак, я сделал вспомогательную функцию, которая express намеревается обновить значение поля. Эта функция имеет 3 параметра. Сначала объект для обновления, второе имя поля и, в-третьих, обратный вызов, который предоставит новое значение и будет вызываться со старым значением.

Это мой пример кода

%dw 1.0
%input payload application/json
%output application/json

%function updateWith( value,fieldName, newValueProvider) 
  using(oldValue = value[fieldName]) (
    (value - fieldName) ++ {(fieldName): newValueProvider(oldValue)}
  )



---
updateWith(payload, "Products", 
  (products) -> (
    {
      "Products": products map ((item) -> 
          updateWith(item, "ProdDetails", 
              ((ProdDetails) -> ProdDetails ++ {"ProdDescription": "This my new Product"})))
    }
  )
)
...