场景 - 将csv文件转换为json格式,获取每个json元素并进行get请求api调用。我在for-each循环序列中这样做。我得到一个json响应(从每个提取eventId和成本)。现在,我希望在主标题列表下将所有这些响应结合在一起,并制作更大的json有效负载。
例如:
{
"listings": [
{
"eventId":"8993478",
"cost":34
},
{
"eventId":"xxxxxyyyy",
"cost":zz
},
]
}
我如何为所有迭代条目执行此操作。我可以为一个条目(使用groovy脚本)执行此操作。
答案 0 :(得分:3)
您可以在for-each
循环之前将变量定义为空列表,其中包含:
<set-variable variableName="listings" value="#[[]]" />
然后,在for-each
循环内的每次迭代中,将元素添加到上一个变量:
<expression-transformer expression="#[flowVars.listings.add(flowVars.iterationMap)]" />
在前面的代码片段中,我使用变量flowVars.iterationMap
来表示每次迭代时生成的映射。
最后,如果需要,您可以在set-payload
循环后添加for-each
转换器:
<set-payload value="#[flowVars.listings]" />
HTH,马科斯
答案 1 :(得分:0)
您可以使用批处理模块,但您必须重写此逻辑稍有不同。例如,您将无法再像Marcos建议的那样使用聚合flowVar。相反,您需要使用固定大小的批处理:提交块(在许多方面实际上会更好,例如,您可以开始向远程API发送批量数据,同时仍然在后台处理其他一些记录)。
答案 2 :(得分:0)
...我喜欢Marco的答案,它对我的用例非常有用。
只需在流变量中创建一个数组,并在ForEach范围内的数组上使用add()方法就可以了。xt / p>
OP跟进问题很好。它促使我使用建议的方法进行替代测试。在这里查看我的两个流程:
<flow name="sampleAggregatorFlow" doc:description="this is a simple demo that shows how to aggregate results into an accumulator array">
<http:listener config-ref="manage-s3-api-httpListenerConfig" path="/aggregate" allowedMethods="GET" doc:name="HTTP"/>
<set-payload value="#[['red','blue','gold']]" doc:name="Set Payload"/>
<set-variable variableName="accumulator" value="#[[]]" doc:name="accumulator"/>
<foreach doc:name="For Each">
<expression-transformer expression="#[flowVars.accumulator.add(payload)]" doc:name="addEm"/>
</foreach>
<set-payload value="#[flowVars.accumulator]" doc:name="Set Payload"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
<flow name="Copy_of_sampleAggregatorFlow" doc:description="this is a simple demo that shows how to aggregate results into an accumulator array">
<http:listener config-ref="manage-s3-api-httpListenerConfig" path="/aggregate2" allowedMethods="GET" doc:name="Copy_of_HTTP"/>
<set-payload value="#[['red','blue','gold']]" doc:name="Copy_of_Set Payload"/>
<set-variable variableName="accumulator" value="#[new java.util.ArrayList()]" doc:name="Copy_of_accumulator"/>
<foreach doc:name="Copy_of_For Each">
<expression-transformer expression="#[flowVars.accumulator.add(payload)]" doc:name="Copy_of_addEm"/>
</foreach>
<set-payload value="#[flowVars.accumulator]" doc:name="Copy_of_Set Payload"/>
<json:object-to-json-transformer doc:name="Copy_of_Object to JSON"/>
</flow>
两种流动产生了相同的结果:
[
"red",
"blue",
"gold"
]
使用Anypoint Studio 6.4.1和Mule Runtime 3.9进行测试12/26/2017