dataweave - 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"
}]
我正在尝试扁平化,但这不起作用。
谢谢你的帮助!
解决方案
一系列flatmap
应该做的伎俩(只是在幕后包装 a 的一个函数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,
SUBGROUP: subgroup.NAME,
USER: subgroup.USERS
}
推荐阅读
- oracle - 如何对Oracle存储过程中特定数量的项目实现最小和最大验证?
- c# - 来自 C# 的 crypto-js DES 解密
- google-cloud-platform - VM 实例 - 配置外部负载均衡器时出现 502 状态错误
- json - 如何保留行中所有数据的 JSON 版本的计算列?
- r - 使用 R 中的 aws.s3 包恢复文件的先前版本
- javascript - 在 Java Web 应用程序中处理大数据
- javascript - 如何使用reactjs和material ui将文本字段添加到表格内的特定行单击按钮
- python - python 基于单个列表的列表字典排序
- javascript - 多选仅在发送到firebase时给出第一个选择
- javascript - 使用 Google App Script 修改 Google Sheet 中的单元格