如何为DataWeave 2.0的skipNullOn和isEmpty()设置例外规则?
问题解决:DataWeave中为特定字段设置skipNullOn和isEmpty例外规则
问题描述
处理包含相似对象的数组时,要求:
- 仅保留非空字段(通过
skipNullOn=everywhere和isEmpty()实现); - 对字段X设置例外:只有原对象包含X字段时才输出
fieldX;若X为null/空值,fieldX的value返回false;若X非空,返回upper(X) == "X"的布尔结果;且不能让X字段出现在原本没有该字段的对象中。
输入示例
{ "data": { "array": [ { "A": "A", "B": 1, "C": "2" }, { "A": "A", "B": 1, "X": "x", "C": "2" }, { "A": "A", "B": 1, "C": "2" } ] } }
修改后的DataWeave代码
%dw 2.0 output application/json skipNullOn = "everywhere" --- payload.data."array" map (value, index) -> { (fieldA: { values: [ value: value.A ] }) if(!isEmpty(value.A)), (fieldB: { values: [ value: value.B ] }) if(!isEmpty(value.B)), (fieldC: { values: [ value: value.C ] }) if(!isEmpty(value.C)), (fieldX: { values: [ value: if(isEmpty(value.X)) false else (upper(value.X) == "X") ] }) if(value.X present) }
关键修改说明
- 条件判断替换:将
fieldX的生成条件从!isEmpty(value.X)改为value.X present,确保只有原对象存在X字段时才生成fieldX,避免无X字段的对象出现该字段; - 字段值逻辑调整:在
fieldX的value中,通过if(isEmpty(value.X)) false else (upper(value.X) == "X")实现需求:X为空/null时返回false,非空时判断转大写后是否等于"X"; - 保留原有规则:继续使用
skipNullOn=everywhere和其他字段的!isEmpty()判断,保证其他字段仅在非空时输出。
期望输出
[ { "fieldA": { "values": [ { "value": "A" } ] }, "fieldB": { "values": [ { "value": 1 } ] }, "fieldC": { "values": [ { "value": "2" } ] } }, { "fieldA": { "values": [ { "value": "A" } ] }, "fieldB": { "values": [ { "value": 1 } ] }, "fieldC": { "values": [ { "value": "2" } ] }, "fieldX": { "values": [ { "value": true } ] } }, { "fieldA": { "values": [ { "value": "A" } ] }, "fieldB": { "values": [ { "value": 1 } ] }, "fieldC": { "values": [ { "value": "2" } ] } } ]
(注:若输入中第二个对象的X为null/空值,fieldX的value会返回false)
内容的提问来源于stack exchange,提问作者muledev
相关产品推荐
相关产品推荐

