如何在MuleSoft中筛选满足子对象条件的完整对象
MuleSoft DataWeave 筛选Offer对象求助
我是MuleSoft新手,需要从给定的JSON Payload中筛选出完整的Offer对象,要求该对象的characters[].data[]数组中存在"name":"priority"且"value":1的项。以下是相关内容:
JSON Payload
{ "offers": [ { "id": 100, "name": "Test1", "category": { "characters": [ { "data": [ { "name": "priority", "value": 1 }, { "type": "ILL", "result": "pass" } ] } ] } }, { "id": 200, "name": "Test2", "category": { "characters": [ { "data": [ { "name": "priority", "value": 2 }, { "type": "ILL", "result": "Fail" } ] } ] } }, { "id": 300, "name": "Test3", "category": { "characters": [ { "data": [ { "name": "priority", "value": 3 }, { "type": "ILL", "result": "Pass" } ] } ] } } ] }
预期结果
{ "id": 100, "name": "Test1", "category": { "characters": [ { "data": [ { "name": "priority", "value": 1 }, { "type": "ILL", "result": "pass" } ] } ] } }
尝试过的不符合需求的代码
(payload.offers map { (($$): $) if((flatten($.category.characters.data) filter ((item, index) -> item.name=="WBB" and item.priority==1))) }) - {}
解决方案
你的代码存在两处关键错误:一是过滤条件里的item.name=="WBB"应该改为"priority",二是判断优先级值时用了item.priority,但原数据里对应的属性是item.value。另外,用map结合条件的方式不够直接,推荐用filter来筛选数组:
筛选出所有符合条件的Offer(返回数组)
%dw 2.0 output application/json --- payload.offers filter ((offer) -> flatten(offer.category.characters.data) any ((item) -> item.name == "priority" and item.value == 1 ) )
仅返回第一个符合条件的Offer(匹配你的预期结果)
%dw 2.0 output application/json --- (payload.offers filter ((offer) -> flatten(offer.category.characters.data) any ((item) -> item.name == "priority" and item.value == 1 ) ))[0]
代码说明
filter:遍历offers数组,保留满足条件的元素flatten(offer.category.characters.data):将嵌套的characters.data数组展开成一维数组,方便后续判断any:检查展开后的数组中是否存在至少一个符合name="priority"且value=1的项,只要存在就保留当前Offer[0]:如果只需要第一个匹配的对象,在筛选后的数组后加上该索引即可
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

