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

DataWeave 2.0如何将重复字段转换为ENDOS数组?

DataWeave JSON结构转换解决方案

原始JSON Payload

{
    "COV": "EL",
    "PART_LETTER": "H",
    "EFFECTIVE_DATE": "29th June",
    "LOI": "£25",
    "ENDO_APPLIED": "Y",
    "ENDO_TITLE": "Some Title",
    "ENDO": "EELZ0001",
    "ENDO_NUM": "1",
    "ENDO": "EELZ0002",
    "ENDO_NUM": "2",
    "ENDO_TEST": "TEST"
}

目标转换结构

{
    "COV": "EL",
    "PART_LETTER": "H",
    "EFFECTIVE_DATE": "29th June",
    "LOI": "£25",
    "ENDO_APPLIED": "Y",
    "ENDO_TITLE": "Some Title",
    "ENDOS": [
        {
            "ENDO": "EELZ0001",
            "ENDO_NUM": "1"
        },
        {
            "ENDO": "EELZ0002",
            "ENDO_NUM": "2",
            "ENDO_TEST": "TEST"
        }
    ]    
}

核心需求

  • 基于ENDO字段创建ENDOS数组,每遇到一个ENDO字段就生成一个新对象
  • 每个新对象包含当前ENDO字段之后、下一个ENDO字段之前的所有相关字段
  • 保留原始Payload中不属于ENDOS的所有字段

尝试的未成功代码

%dw 2.0
output application/json

var endorsements = [payload] filter ($.ENDO != null) map (item) -> {
    "ENDO": item."ENDO",
    "ENDO_NUM": item."ENDO_NUM",
    "ENDO_TEST": item."ENDO_TEST"
}

---
payload ++ {
    "ENDORSEMENTS": endorsements
}

正确解决方案

DataWeave代码

%dw 2.0
output application/json

// 提取所有不属于ENDOS的字段
var nonEndoFields = payload - ["ENDO", "ENDO_NUM", "ENDO_TEST"]

// 构建ENDOS数组:处理重复键生成的数组,将对应字段配对
var endos = do {
    // 确保ENDO值为数组,兼容单个/多个值的情况
    var endoList = payload.ENDO default []
    // 处理ENDO_NUM数组,不足项用null补全
    var endoNumList = payload.ENDO_NUM default []
    // 处理ENDO_TEST:单个值转为数组,确保和ENDO列表长度匹配
    var endoTestList = if (payload.ENDO_TEST is String) [payload.ENDO_TEST] else (payload.ENDO_TEST default [])
    
    // 遍历每个ENDO索引,构建对应的对象
    endoList map ((endoVal, idx) -> {
        ENDO: endoVal,
        ENDO_NUM: endoNumList[idx] default null,
        ENDO_TEST: endoTestList[idx] default null
    }) filter ((item) -> item.ENDO != null) // 过滤空的ENDO项
}

---
// 合并非ENDOS字段和ENDOS数组
nonEndoFields ++ { ENDOS: endos }

代码说明

  1. 提取非ENDOS字段:使用payload - ["ENDO", "ENDO_NUM", "ENDO_TEST"]排除需要放入数组的字段,保留其他原始字段
  2. 处理重复键:DataWeave会自动将JSON中的重复键解析为数组,所以payload.ENDO会变成["EELZ0001", "EELZ0002"],payload.ENDO_NUM变成["1", "2"]
  3. 配对字段:通过索引将每个ENDO对应的ENDO_NUM、ENDO_TEST值配对到同一个对象中,用default null避免索引越界导致报错
  4. 合并结果:将提取的非ENDOS字段和构建好的ENDOS数组合并,得到目标结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:13:29