问题描述
在使用 Dataweave 2.0 转换如下消息时需要您的帮助。
[
{
"GROUP": "GROUP_A","SUBGROUPS": [{
"NAME": "SUBGROUP A1","USERS": "USER 1"
}]
},{
"GROUP": "GROUP_B","SUBGROUPS": [{
"NAME": "SUBGROUP B1","USERS": "user 2"
},{
"NAME": "SUBGROUP B2","USERS": ["USER 3","USER 4","USER 5"]
}]
}
]
Dataweave 转换将有效负载转换为如下结构的内容会是什么样子:
[{
"GROUP": "GROUP_A","SUBGROUP": "SUBGROUP A1","USER": "USER 1"
},{
"GROUP": "GROUP_B","SUBGROUP": "SUBGROUP B1","USER": "USER 2"
},"SUBGROUP": "SUBGROUP B2","USER": "USER 3"
},"USER": "USER 4"
},"USER": "USER 5"
}]
我正在尝试使用 flatten,但这不起作用。
感谢您的帮助!
解决方法
一系列 flatmap
应该可以解决问题(只是一个在幕后用 map
包装 flatten
的函数)。唯一棘手的部分是,在您的示例中,看起来 SUBGROUPS 可以是字符串或字符串数组。为了更好地了解您正在做什么,请将每个 flatmap
替换为 map
。您将看到结构的外观,以及为什么将其展平会产生您想要的效果。如果你是这样的函数式编程的新手,映射基本上是一种迭代某些东西的方式——所以我们正在做的是迭代每个组,然后是该组中的所有子组,然后是该子组中的所有用户(如果它是一个数组)。这会在我们绘制地图的每个级别创建一个对象数组。从那里,我们将其全部压缩为一个数组。
%dw 2.0
output application/json
---
payload flatMap (group) ->
group.SUBGROUPS flatMap (subgroup) ->
if (subgroup.USERS is Array)
subgroup.USERS map (user) -> {
GROUP: group.GROUP,SUBGROUP: subgroup.NAME,USER: user
}
else {
GROUP: group.GROUP,USER: subgroup.USERS
}