DataWeave过滤XML中SUPP开头字段的代码问题排查
DataWeave代码问题排查:筛选SUPP开头字段返回空的解决方法
输入XML
<screenFields> <ScreenFieldDTO> <fieldName>SUPP1</fieldName> <value>123</value> </ScreenFieldDTO> <ScreenFieldDTO> <fieldName>MAKE1</fieldName> <value>ABC</value> </ScreenFieldDTO> <ScreenFieldDTO> <fieldName>SUPP2</fieldName> <value>234</value> </ScreenFieldDTO> <ScreenFieldDTO> <fieldName>NORM2</fieldName> <value>TXT2</value> </ScreenFieldDTO> <ScreenFieldDTO> <fieldName>SUPP3</fieldName> <value>124</value> </ScreenFieldDTO> </screenFields>
期望输出JSON
{ "suppliers": [ {"fieldname" : "SUPP1", "value": "123"}, {"fieldname" : "SUPP2", "value": "234"}, {"fieldname" : "SUPP3", "value": "124"} ] }
注:你给出的期望JSON存在语法错误(对象直接包含数组不符合JSON规范),这里调整为数组放在suppliers键下,符合标准JSON结构。
你的问题代码
%dw 2.0 output application/json fun filterSupplier(val) = if(val startsWith("SUPP")) "SUPP" else "" --- { "fieldname": payload.screenFields.*ScreenFieldDTO filter $.fieldName == (filterSupplier($.fieldName)) }
问题分析
- 筛选逻辑错误:
filterSupplier函数在字段名以SUPP开头时返回字符串"SUPP",但你用$.fieldName == filterSupplier($.fieldName)做判断,相当于拿完整字段名(如SUPP1)和"SUPP"做相等比较,永远不会匹配,导致筛选结果为空。 - 输出结构不匹配:你将筛选结果放在
fieldname键下,但期望输出是包含目标数组的对象,且原代码未对字段名做大小写转换(期望是小写fieldname)。 - 未正确映射字段:没有将原XML中的
fieldName和value映射为期望的键值结构。
修正后的代码
简化版(直接使用startsWith判断)
%dw 2.0 output application/json --- { suppliers: payload.screenFields.*ScreenFieldDTO filter $.fieldName startsWith "SUPP" map { fieldname: $.fieldName, value: $.value } }
修复函数版(保留你的filterSupplier函数并修正逻辑)
%dw 2.0 output application/json fun filterSupplier(val) = val startsWith "SUPP" --- { suppliers: payload.screenFields.*ScreenFieldDTO filter filterSupplier($.fieldName) map { fieldname: $.fieldName, value: $.value } }
内容的提问来源于stack exchange,提问作者Abjt G
相关产品推荐
相关产品推荐

