首页 > 解决方案 > 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"
}, {
   "GROUP": "GROUP_B",
   "SUBGROUP": "SUBGROUP B2",
   "USER": "USER 3"
}, {
   "GROUP": "GROUP_B",
   "SUBGROUP": "SUBGROUP B2",
   "USER": "USER 4"
}, {
   "GROUP": "GROUP_B",
   "SUBGROUP": "SUBGROUP B2",
   "USER": "USER 5"
}]

我正在尝试扁平化,但这不起作用。

谢谢你的帮助!

标签: dataweavemulesoft

解决方案


一系列flatmap应该做的伎俩(只是在幕后包装 a 的一个函数mapflatten。唯一棘手的部分是,在您的示例中,看起来 SUBGROUPS 可以是字符串或字符串数​​组。为了更好地了解您正在做什么,请将每个替换flatmapmap. 您将看到结构的样子,以及为什么将其展平会产生您想要的结果。如果您是这样的函数式编程的新手,地图基本上是一种迭代某些东西的方法——所以我们正在做的是迭代每个组,然后是该组中的所有子组,然后是子组中的所有用户(如果它是一个数组)。这会在我们制作地图的每个级别创建一个对象数组。从那里,我们将其全部扁平化为一个阵列。

%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,
            SUBGROUP: subgroup.NAME,
            USER: subgroup.USERS
        }

推荐阅读