如何用DataWeave从静态Payload提取多产品数据并合并结果
多产品Code查询的DataWeave代码修改方案
需求说明
现有DataWeave代码仅支持单个产品code查询并返回对应结果,需修改为支持传入多个code(格式如"2698791-01, 9696379-01, 9696377-01"),提取所有匹配的产品数据并合并为指定结构的JSON结果。
静态Payload
[ {"products": [{"code": "2698791-01", "url": "https://www.product.com/268791-01.png", "basePrice": {"value": 679.00, "formattedValue": "679,00 €"}, "name": "Product 1 Pro", "friendlyName": "Pro"}]}, {"products": [{"code": "9696379-01", "url": "https://www.product.com/966379-01.png", "basePrice": {"value": 2.90, "formattedValue": "2,90 €"}, "name": "Product 2 Ultra", "friendlyName": "Ultra"}]}, {"products": [{"code": "9696377-01", "url": "https://www.product.com/966377-01.png", "basePrice": {"value": 72.90, "formattedValue": "72,90 €"}, "name": "Product 3 Plus", "friendlyName": "Plus"}]} ]
现有代码(仅支持单个code)
%dw 2.0 output application/json var id = "1234" var code = "9696379-01" var idObj = { "currency": "EUR", "id": id } var productObj = payload var fileData = productObj filter ((item, index) -> item.products.code == [code]) --- idObj ++ fileData[0]
预期输出
{ "currency": "EUR", "id": "1234", "products": [ {"code": "2698791-01", "url": "https://www.product.com/268791-01.png", "basePrice": {"value": 679.00, "formattedValue": "679,00 €"}, "name": "Product 1 Pro", "friendlyName": "Pro"}, {"code": "9696379-01", "url": "https://www.product.com/966379-01.png", "basePrice": {"value": 2.90, "formattedValue": "2,90 €"}, "name": "Product 2 Ultra", "friendlyName": "Ultra"}, {"code": "9696377-01", "url": "https://www.product.com/966377-01.png", "basePrice": {"value": 72.90, "formattedValue": "72,90 €"}, "name": "Product 3 Plus", "friendlyName": "Plus"} ] }
修改后的DataWeave代码
%dw 2.0 output application/json var id = "1234" var codeStr = "2698791-01, 9696379-01, 9696377-01" // 将逗号分隔的code字符串转为去空格后的数组 var targetCodes = codeStr splitBy "," map trim($) var idObj = { "currency": "EUR", "id": id } // 过滤出产品code在目标数组中的项,再扁平化所有products列表 var matchedProducts = payload filter ((item) -> item.products.code[0] in targetCodes) flatMap ($.products) --- idObj ++ { products: matchedProducts }
关键改动说明
- 处理多code输入:使用
splitBy ","分割字符串,再用trim($)去除每个code前后的空格,生成干净的目标code数组 - 调整过滤逻辑:通过
item.products.code[0] in targetCodes判断当前项的产品code是否在目标列表中(因原Payload每个item的products是单元素数组,所以取code[0]) - 合并产品列表:用
flatMap将所有匹配项的products数组扁平化,合并为一个统一的产品数组 - 组装最终结构:将idObj与包含合并后产品数组的对象合并,得到预期的JSON结构
内容的提问来源于stack exchange,提问作者JayR
相关产品推荐
相关产品推荐

