Dataweave 1.0将项目添加到数组中

问题描述 投票:1回答:1

我的有效负载示例如下:

{
  "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”的新属性,以便我的输出看起来像这样:

{
  "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"
      }
    }
  ]
}

我提供的有效负载只是一个示例,它具有数百个属性。我只需要向“产品”数组添加新属性,并将其他项保留在主有效负载中即可。是否可以做一个完整的有效负载“ map”,并在内部使用“ mapobject”向数组添加新属性?我正在使用dataweave 1.0

mule mule-studio mule-component dataweave anypoint-studio
1个回答
0
投票

最简单的方法是使用“-”运算符删除“ Product”条目,然后使用“ ++”添加新的“ Product”条目以使用“ +”运算符将新元素追加到数组中

所以我所做的是一个帮助函数,该函数表达了更新字段值的意图。该函数有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"})))
    }
  )
)
© www.soinside.com 2019 - 2024. All rights reserved.