如何在MuleSoft的DataWeave中实现指定JSON对象数组转换?
DataWeave实现JSON分组转换问题解决
我需要将给定的输入JSON转换为指定的预期输出JSON,尝试使用filter函数、groupBy函数及如下DataWeave代码,但生成多输出时测试用例失败,请求指导正确的实现方式。
尝试的代码
%dw 2.0 output application/json --- payload.Bd map (val,index) ->{ "d23": val, "lt":(payload.output2 filter(payload.Bd contains val) map(Value) -> { Val34: Value.PId } ) }
输入JSON
[ { "Val34": "968", "d23": "Y1" }, { "Val34": "958", "d23": "Y2" }, { "Val34": "951", "d23": "Y2" } ]
预期输出JSON
[ { "d23": "Y1", "lt": [ { "Val34": "968" } ] }, { "d23": "Y2", "lt": [ { "Val34": "958" }, { "Val34": "951" } ] } ]
问题分析与正确实现
你尝试的代码错误引用了payload.Bd和payload.output2字段,但输入JSON里并没有这些结构,输入是直接包含目标字段的对象数组。正确的做法是用groupBy按d23字段分组,再将分组结果转换为预期格式:
正确代码
%dw 2.0 output application/json --- payload groupBy ($.d23) mapObject ((value, key) -> { d23: key, lt: value map { Val34: $.Val34 } }) pluck $
代码说明
payload groupBy ($.d23):将输入数组按d23字段的值分组,得到一个键为d23值、值为对应对象数组的对象。mapObject ((value, key) -> { ... }):遍历分组后的对象,将每个键值对转换为包含d23(分组键)和lt(处理后的对象数组)的结构。value map { Val34: $.Val34 }:将分组后的每个对象映射为只保留Val34字段的新对象。pluck $:将最终的对象转换为数组,匹配预期输出的结构。
内容的提问来源于stack exchange,提问作者codeSolver
相关产品推荐
相关产品推荐

