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 }
代码说明
- 提取非ENDOS字段:使用
payload - ["ENDO", "ENDO_NUM", "ENDO_TEST"]排除需要放入数组的字段,保留其他原始字段 - 处理重复键:DataWeave会自动将JSON中的重复键解析为数组,所以
payload.ENDO会变成["EELZ0001", "EELZ0002"],payload.ENDO_NUM变成["1", "2"] - 配对字段:通过索引将每个
ENDO对应的ENDO_NUM、ENDO_TEST值配对到同一个对象中,用default null避免索引越界导致报错 - 合并结果:将提取的非ENDOS字段和构建好的
ENDOS数组合并,得到目标结构
内容的提问来源于stack exchange,提问作者Mark Okane
相关产品推荐
相关产品推荐

