DataWeave Map函数无法获取数组值,如何实现JSON转换需求?
问题:过滤空bea_order项并合并转换数组元素
需求:处理JSON输入,过滤掉bea_order为空数组的对象,提取所有非空bea_order内的元素并合并,转换为指定格式的输出。
输入示例
[ { "bea_order":[ ] }, { "bea_order":[ { "PO_Receipt_Date__c":"2021-08-13", "Id":"a3I1T000003E6SQUA0" }, { "PO_Receipt_Date__c":null, "Id":"a3Iq0000000OhnREAS" }, { "PO_Receipt_Date__c":null, "Id":"a3Iq0000000OhnWEAS" } ] }, { "bea_order":[ { "PO_Receipt_Date__c":"2022-05-06", "Id":"a3I1T000003E6SOUA0" } ] }, { "bea_order":[ ] } ]
预期输出
[ { "id":"a3I1T000003E6SQUA0", "flag":"false" }, { "id":"a3Iq0000000OhnREAS", "flag":"false" }, { "id":"a3Iq0000000OhnWEAS", "flag":"false" }, { "id":"a3I1T000003E6SOUA0", "flag":"false" } ]
尝试的错误代码
%dw 2.0 output application/json --- payload.bea_order filter ($.Id != null) map () -> { id : $.Id, flag : 'false' }
修正后的解决方案
原代码的问题在于:直接取payload.bea_order会得到数组的数组,且未先过滤空bea_order的对象,也没有展开嵌套数组。以下是修正后的DataWeave代码:
%dw 2.0 output application/json --- payload // 过滤掉bea_order为空的对象 filter (sizeOf($.bea_order) > 0) // 展开所有bea_order数组,合并为单个数组 flatMap ($.bea_order) // 可选:过滤掉Id为空的元素 filter ($.Id != null) // 转换为目标格式 map { id: $.Id, flag: "false" }
代码说明
- 过滤空bea_order对象:通过
filter (sizeOf($.bea_order) > 0)排除所有bea_order为空数组的项。 - 展开嵌套数组:
flatMap ($.bea_order)将多个独立的bea_order数组展开合并成一维数组,避免嵌套结构。 - 元素格式转换:用
map将原元素的Id字段转为小写的id,并添加固定值flag: "false";保留filter ($.Id != null)可确保只处理含有效Id的元素。
内容的提问来源于stack exchange,提问作者Yatan
相关产品推荐
相关产品推荐

