繁体   English   中英

使用 Dataweave2.0 提取内部字段对象并将它们应用于相应的顶级对象

[英]Extract the inner field objects and apply them to respective top level objects using Dataweave2.0

我正在尝试从给定的输入中获得以下 output。 我已经尝试了几种制作通用 function 的方法,这样当任何数据以类似的结构传递时,我都会得到类似的 output。请帮助我实现这一目标。

输入

[{
  "name": "Thinker",
  "details": [
      {
      "num": 1
      }, 
      {
      "num": 2
      }
   ]
}, 
{
  "name": "Blinker",
  "details": [
      {
      "num": 3
      }, 
      {
      "num": 4
      }
   ]
}]

Output

[{
  "name": "Thinker",
  "num": 1
},
{
  "name": "Thinker",
  "num": 2
},
{
  "name": "Blinker",
  "num": 3
},
{
  "name": "Blinker",
  "num": 4
}]

关键是通过外部和内部 arrays 进行映射,然后展平结果:

output application/json
---
flatten (payload map ((item, index) -> item.details map ((detail, index) -> {
    name: item.name,
    num: detail.num
})))

正如 Aled 在对其中一个答案的评论中提到的那样,这可能是解决此问题的另一种方法。

%dw 2.0
output application/json
---
payload flatMap (item,index) -> (
      item.details map {
           name: item.name,
           num:  $.num
      }
)

试试这个 DW

主阵列上的第一个 Map 到 Map

第二 Map 至 Map 详情

reduce 将嵌套数组转换为单个数组

%dw 2.0
output application/json
---
payload map(
    ($.details map(item,index)->{
        "name":($.name),
        "num":item[0]
    })
)reduce($$++$)

Output

[
  {
    "name": "Thinker",
    "num": 1
  },
  {
    "name": "Thinker",
    "num": 2
  },
  {
    "name": "Blinker",
    "num": 3
  },
  {
    "name": "Blinker",
    "num": 4
  }
]

数据中心

%dw 2.0
output application/json
---
payload map(
    ($.details map(item,index)->{
        (keysOf($)[0]):($.name),
        (keysOf(item)[0]):item[0]
    })
)reduce($$++$)

如果您的请求结构将始终保持这种方式(无论字段名称如何),那么您可以尝试如下脚本,它更通用并且可以在相同类型的结构上工作

%dw 2.0
output application/json
---
payload flatMap ((item, index) -> 
   (item filterObject ($ is Array))[0] map 
                 ($ ++ (item filterObject ($ is String | Number | Null)) )
 
)

注意:它始终可以在这种类型的结构上工作并且不依赖于字段名称,并给出预期的 output

[{
  "anyname": "xyz",
  "anydetails": [
      {
      "abc": 1
      }, 
      {
      "ijk": 2
      }
   ]
}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM