You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
    })
)

问题分析

  1. Pluck参数顺序错误:DataWeave中pluck的语法是pluck (value, key) -> ...,原代码将priority(实际是value)和systemType(实际是key)的顺序写反了,导致变量赋值错误。
  2. 未处理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
                }
)

代码解释

  1. 最外层遍历:用pluck遍历payload的顶层节点(P2、P3),priorityKey是优先级名称(如P2),priorityData是对应的值。
  2. 过滤null节点:使用filterObject过滤掉priorityData中值为null的节点(如P3下的etc)。
  3. 遍历系统类型:遍历过滤后的priorityData,得到systemTypeKey(如queue、host)和对应的systemTypeData。
  4. 遍历系统名称:遍历systemTypeData中的每个系统节点,提取systemName、smsTo、mailTo,并组合priorityKey、systemTypeKey生成目标对象。
  5. 扁平化数组:用flatten将多层嵌套的数组转换为一维数组,得到期望的输出结构。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:00:35