mule - Dataweave(嵌套) map 条件映射

标签 mule dataweave

案例

我有一个 json 对象(从 excel 文件导入,之后也需要像一个一样格式化)。所以我根本不能弄乱结构。

输入由一个带有工作表的 json 格式的对象组成,每个工作表都是一个对象数组。

当 sheetnumber 等于 'append' 对象中的 kwadrantcode 时,我想将另一个对象(var 'append')添加到数组(作为最后一项)

输入1

有效载荷

    {
  "(sheet)1": [
    {
      "kwadrantId": 1.0,
      "Team": "blauw1",
      "timestamp": "2019-09-26T16:37:54",
      "controlecode": 12431
    }
  ],
  "(sheet)2": [
    {
      "kwadrantId": 2.0,
      "Team": "rood1",
      "timestamp": "2019-09-26T16:37:54",
      "controlecode": 81243
    },
    {
      "kwadrantId": 2.0,
      "Team": "blauw2",
      "timestamp": "2019-09-26T18:00:54",
      "controlecode": 67676
    }
  ]
}

到目前为止的代码

%dw 2.0
output application/json

var append =   {"kwadrant": "2",
  "controlecode": "22222",
  "kleur": "blauw",
  "subteam": "1",
  "form_id": "83177",
  "submit": "Claim"
}
--- 
payload pluck($) map (sheet, sheetnumber)-> (sheet map (claim, claimcounter) -> claim) ++ [append]

此代码成功地将对象附加到数组的正确位置。 这里的问题是最后一部分( map 目标)似乎不允许有条件。 所以它总是将它插入到每个列表的末尾,而不仅仅是我希望它结束​​的那个。

[
  [
    {
      "kwadrantId": 1.0,
      "Team": "blauw1",
      "timestamp": "2019-09-26T16:37:54",
      "controlecode": "12431"
    },
    {
      "kwadrant": "2",
      "controlecode": "22222",
      "kleur": "blauw",
      "subteam": "1",
      "form_id": "83177",
      "submit": "Claim"
    }
  ],
  [
    {
      "kwadrantId": 2.0,
      "Team": "rood1",
      "timestamp": "2019-09-26T16:37:54",
      "controlecode": "12431"
    },
    {
      "kwadrantId": 2.0,
      "Team": "blauw2",
      "timestamp": "2019-09-26T18:00:54",
      "controlecode": 67676.0
    },
    {
      "kwadrant": "2",
      "controlecode": "22222",
      "kleur": "blauw",
      "subteam": "1",
      "form_id": "83177",
      "submit": "Claim"
    }
  ]
]

我尝试过的一些东西

honestly, i think i've tried everything the past two hours, but here are a few i can think of out of the top of my head.

++ [append] if (true) 

(if true )++ [append]

payload pluck($) map (sheet, sheetnumber)-> (sheet map (claim, claimcounter) -> claim)((if true) ++ [append])

and most variations i can think of with brackets

稍后我会担心将“追加”var 格式化为正确的结构,只是将它放在正确的位置是我似乎无法工作的问题。

最佳答案

我能想到的最简单的方法是使用 mapObject功能

%dw 2.0
output application/json

var append =   
    {
    "kwadrant": "2",
    "controlecode": "22222",
    "kleur": "blauw",
    "subteam": "1",
    "form_id": "83177",
    "submit": "Claim"
    }

fun extractNumber(pageName: Key) = 
     (pageName as String match  /\(sheet\)([0-9]+)/)[1]    
---
payload mapObject ((value, key, index) -> do {
        if(extractNumber(key) == append.kwadrant)
            {(key): value << append}
         else
            {(key): value}
})

所以基本上我会查找根目录中的每张工作表,当它与我需要添加的工作表匹配时,使用 <<

将其附加到值

关于mule - Dataweave(嵌套) map 条件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135665/

相关文章:

java - Mule API 从 HTTP 迁移到 HTTPs

maven - Mule 中的部署后集成测试

mule - 我如何处理 mule Choice 路由器中的 HTTP 路径参数?

mule - 在 Mule 插件的 Transform Message 中使用 p() 函数

java - Mule 3.7.3 - Dataveawe 消息转换器编码错误

dataweave - 如何根据 id 值合并 2 个字段并确保该字段是否不可用

reduce - DataWeave 2.0 如何为 reduce() 构建动态填充的累加器

dataweave - 如何获取XML编码类型?

dataweave - 在 Dataweave 2.0 中添加默认 namespace 的其他方法?

dataweave - JSON 对象忽略 null