Mule 有没有办法用Dataweave映射创建更灵活的循环?
我有一个问题,在任何其他语言中都需要10秒钟,但在这里,我无法用Dataweave解决它 我有这样的JSON:Mule 有没有办法用Dataweave映射创建更灵活的循环?,mule,dataweave,Mule,Dataweave,我有一个问题,在任何其他语言中都需要10秒钟,但在这里,我无法用Dataweave解决它 我有这样的JSON: { "100": [{ "courseID": "100", "course": "physics", "instructor": "John S", "section": "A", "date": "01-01-1900" }], "200": [{ "course
{
"100": [{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"section": "A",
"date": "01-01-1900"
}],
"200": [{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "A",
"date": "01-03-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "B",
"date": "01-07-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "C",
"date": "01-08-1900"
}
]}
}
我确信数组中的对象包含重复的信息,除了节和日期。所以我需要将其压缩并转化为:
{
"courses": [{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"sections": [{
"section": "A",
"date": "01-01-1900"
}]
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"sections": [{
"section": "A",
"date": "01-03-1900"
},
{
"section": "B",
"date": "01-07-1900"
},
{
"section": "C",
"date": "01-08-1900"
}]
]}
我不能让这事发生。我已经尝试了所有我能看到的方法,使用map()、mapObject()和Pulk()对文档进行迭代。我认为它们需要嵌套,我只想从它迭代的第一个课程中提取ID、课程和讲师,然后继续用部分数据构建对象。嵌套似乎会导致问题,因为存在对象和数组的混合,如果嵌套函数返回错误的类型,map()和mapObject()会抱怨。这是我一直在尝试但没有成功的事情:
%dw 2.0
output application/json
---
"courses": payload.pluck(courseValue, courseKey, courseIndex) ->
courseValue map (classValue, classKey, classIndex) ->
{ courseID: classValue.courseID,
instructor: classValue.instructor
etc...
}
我希望一切都清楚了。我很累了,因为我把它弄得太久了。我想做的事情是否太复杂,DW无法处理,我应该使用另一种方法?此解决方案应该适用于所有DataWeave版本
courses: (payload pluck $$) map using (c = payload[$]) {
courseID : $,
course: c[0].course,
instructor: c[0].instructor,
sections: c map {
section: $.section,
date: $.date
}
}
该解决方案在Mule 3.x中有效,但在4.x中无效,这在本博客文章“从对象到数组的自动强制”中有解释:
我看到您正在使用DataWeave 2.0。下面是您可以使用的简单DataWeave transformer 变压器:
<ee:transform doc:name="Transform Message" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
courses: (payload pluck $$) map ((courseValue, courseKey) -> {
courseID: payload[courseValue][0].courseID,
course: payload[courseValue][0].course,
instructor: payload[courseValue][0].instructor,
sections: payload[courseValue] map ((sectionValue, sectionKey) -> {
section: sectionValue.section,
date: sectionValue.date
})
})
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
{
"100": [
{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"section": "A",
"date": "01-01-1900"
}
],
"200": [
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "A",
"date": "01-03-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "B",
"date": "01-07-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "C",
"date": "01-08-1900"
}
]
}
{
"courses": [
{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"sections": [
{
"section": "A",
"date": "01-01-1900"
}
]
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"sections": [
{
"section": "A",
"date": "01-03-1900"
},
{
"section": "B",
"date": "01-07-1900"
},
{
"section": "C",
"date": "01-08-1900"
}
]
}
]
}
输出:
<ee:transform doc:name="Transform Message" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
courses: (payload pluck $$) map ((courseValue, courseKey) -> {
courseID: payload[courseValue][0].courseID,
course: payload[courseValue][0].course,
instructor: payload[courseValue][0].instructor,
sections: payload[courseValue] map ((sectionValue, sectionKey) -> {
section: sectionValue.section,
date: sectionValue.date
})
})
}
]]></ee:set-payload>
</ee:message>
</ee:transform>
{
"100": [
{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"section": "A",
"date": "01-01-1900"
}
],
"200": [
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "A",
"date": "01-03-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "B",
"date": "01-07-1900"
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"section": "C",
"date": "01-08-1900"
}
]
}
{
"courses": [
{
"courseID": "100",
"course": "physics",
"instructor": "John S",
"sections": [
{
"section": "A",
"date": "01-01-1900"
}
]
},
{
"courseID": "200",
"course": "math",
"instructor": "Jim R",
"sections": [
{
"section": "A",
"date": "01-03-1900"
},
{
"section": "B",
"date": "01-07-1900"
},
{
"section": "C",
"date": "01-08-1900"
}
]
}
]
}
非常感谢你的帮助。不幸的是,这对我不起作用。我收到以下错误:消息:“您使用以下参数调用函数‘map’:1:Object({“100”):[{courseID:“100”,course:“physics”,…)2:function($:Any,$$:Any)->?),但它需要以下类型的参数:1:Array 2:function我尝试将map()更改为mapObject(),这不会给我一个错误,但只输出输入中的最后一个过程。它似乎会在每次迭代中循环并覆盖输出,只导致输出中的最后一个过程。您发布的错误消息表明您正在使用Mule 4.x,因此在对Mule 4.x中的更改进行一些研究之后,我添加了一个解决方案在这一点上,我认为这对你是有效的,所以这类方法很有效,但它只会输出列表中的最后一个课程。有点像循环在每次迭代中覆盖自己的输出。