MuleSoft Dataweave:需要使用 2.0 将列表合并为一条记录

问题描述

在使用 Dataweave 2.0 转换如下消息时需要您的帮助。

如果我有以下用户的 JSON 负载,包含一个组和子组。

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