DataWeave消息映射求助:输入JSON转目标数组失败
DataWeave映射问题:嵌套JSON转指定结构数组
问题背景
需要将嵌套JSON转换为包含systemName、priority、systemType、smsTo、mailTo字段的一维数组,原编写的DataWeave代码无法正常运行,需修复。
输入JSON
{"P2": {"queue": {"tst-bp-1": {"smsTo": "John Test1: 06-12345678, Emilo Test1: 06-87654321","mailTo": "johntest1@test.com, emilotest1@test.com"},"tst-bp-2": {"smsTo": "John Test2: 06-12345678, Emilo Test2: 06-87654321","mailTo": "johntest2@test.com, emilotest2@test.com"}},"host": {"systemP@testbp.com": {"smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"},"systemXAF@testbp.com": {"smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"}},"cert": {"getMySystemname@werbung.com": {"smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"}}},"P3": {"queue": {"acc-bp-1": {"smsTo": "John Test1: 06-12345678, Emilo Test1: 06-87654321","mailTo": "johntest1@test.com, emilotest1@test.com"}},"host": {"ACCsystem@testbp.com": {"smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"}},"etc": null}}
期望输出
[{"systemName": "tst-bp-1","priority": "P2","systemType": "queue","smsTo": "John Test1: 06-12345678, Emilo Test1: 06-87654321","mailTo": "johntest1@test.com, emilotest1@test.com"},{"systemName": "tst-bp-2","priority": "P2","systemType": "queue","smsTo": "John Test2: 06-12345678, Emilo Test2: 06-87654321","mailTo": "johntest2@test.com, emilotest2@test.com"},{"systemName": "systemP@testbp.com","priority": "P2","systemType": "host","smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"},{"systemName": "systemXAF@testbp.com","priority": "P2","systemType": "host","smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"},{"systemName": "getMySystemname@werbung.com","priority": "P2","systemType": "cert","smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"},{"systemName": "acc-bp-1","priority": "P3","systemType": "queue","smsTo": "John Test1: 06-12345678, Emilo Test1: 06-87654321","mailTo": "johntest1@test.com, emilotest1@test.com"},{"systemName": "ACCsystem@testbp.com","priority": "P3","systemType": "host","smsTo": "Jeff Test1: 06-12345678, Tim Test1: 06-87654321","mailTo": "Jeff test1@test.com, timtest1@test.com"}]
尝试的代码
flatten(payload pluck (priority, systemType) -> systemType pluck ((systemName, systemData) -> { systemName: systemName, priority: priority, systemType: systemType, smsTo: systemData."smsTo", mailTo: systemData."mailTo" }) )
问题分析
- Pluck参数顺序错误:DataWeave中
pluck的语法是pluck (value, key) -> ...,原代码将priority(实际是value)和systemType(实际是key)的顺序写反了,导致变量赋值错误。 - 未处理null值:输入JSON中存在
"etc": null的空值节点,直接遍历会引发类型错误,需要过滤掉这类无效节点。
解决方案
以下是修正后的DataWeave代码:
flatten( payload pluck (priorityData, priorityKey) -> priorityData filterObject ((value, key) -> value != null) // 过滤null节点 pluck (systemTypeData, systemTypeKey) -> systemTypeData pluck (contactData, systemName) -> { systemName: systemName, priority: priorityKey, systemType: systemTypeKey, smsTo: contactData.smsTo, mailTo: contactData.mailTo } )
代码解释
- 最外层遍历:用
pluck遍历payload的顶层节点(P2、P3),priorityKey是优先级名称(如P2),priorityData是对应的值。 - 过滤null节点:使用
filterObject过滤掉priorityData中值为null的节点(如P3下的etc)。 - 遍历系统类型:遍历过滤后的
priorityData,得到systemTypeKey(如queue、host)和对应的systemTypeData。 - 遍历系统名称:遍历
systemTypeData中的每个系统节点,提取systemName、smsTo、mailTo,并组合priorityKey、systemTypeKey生成目标对象。 - 扁平化数组:用
flatten将多层嵌套的数组转换为一维数组,得到期望的输出结构。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

