【问题标题】:Dataweave 1.0 Add Items to ArrayDataweave 1.0 将项目添加到数组
【发布时间】:2020-04-13 09:52:20
【问题描述】:

我的示例负载如下:

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

我需要在“Products”数组中添加一个名为“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"
      }
    }
  ]
}

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

【问题讨论】:

    标签: mule mule-studio mule-component dataweave anypoint-studio


    【解决方案1】:

    执行此操作的最简单方法是使用“-”运算符删除“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"})))
        }
      )
    )
    

    【讨论】:

    • 感谢您的回答。如果我要在第一个产品本身下添加一个新属性,这会起作用吗?我想你已经举了一个例子来添加一个新产品本身。
    • 我正在尝试这样的事情:payload - "Products" ++ ( { Products: payload.Products + ("ProdDescription": "This is a Sample") } ) 但是没有得到想要的输出
    • 我已经更新了一个新的 sn-p,它可以满足您的要求
    • 非常感谢您。使用您以前的方法,我能够使用 mapobject:payload - "Products" ++ ( (Products: payload.Products mapObject {($$): $} ++ {"ProdDescription": "This is a Sample" } ) )
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多