user1991
user1991

Reputation: 21

Add one more element to the object array inside for each loop in mule 3

I have Input as below

[{Name=ABC, ID=123},{Name=XYZ, ID=345}]

I would iterate over this collection in a for-each loop and add one more element Age to each object. My expected output would be like

[{Name=ABC, ID=123, Age=23},{Name=XYZ, ID=345, Age=24}]

Any help would be highly appreciated. Thanks in advance.

Upvotes: 1

Views: 1878

Answers (2)

user1991
user1991

Reputation: 21

It was not possible with DW as because payload inside for-each was modified. So I tried using Expression component. Below is my configuration XML.

<flow name="add-one-more-element-to-the-original-payload">
    <poll doc:name="Poll">
        <fixed-frequency-scheduler frequency="30" timeUnit="SECONDS"/>
        <logger message="Pooling Started" level="INFO" doc:name="Log"/>
    </poll>
    <dw:transform-message doc:name="Transform Payload">
        <dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var collection = [{"Name":"ABC","ID":123},{"Name":"XYZ","ID":345}]
---
collection]]></dw:set-payload>
    </dw:transform-message>
    <set-variable variableName="outputList" value="#[new java.util.ArrayList()]" 
doc:name="Set Variable"/>
            <foreach doc:name="For Each" collection="#[payload]">
        <dw:transform-message doc:name="CurrentPayload">
            <dw:set-variable variableName="currentPayload"><![CDATA[%dw 1.0
%output application/java
---
payload]]></dw:set-variable>
        </dw:transform-message>
        <flow-ref name="get-age-subflow" doc:name="Get Age"/>
        <expression-component doc:name="Expression"><! 
[CDATA[flowVars.currentPayload.Age=payload.Age;]]></expression-component>
        <expression-transformer expression="# 
[flowVars.outputList.add(flowVars.currentPayload)]" doc:name="Expression"/>
    </foreach>
    <logger message="#[flowVars.outputList]" level="INFO" doc:name="Logger"/>
</flow>
<sub-flow name="get-age-subflow">
    <dw:transform-message doc:name="Transform Age">
        <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
{
Age:24
}]]></dw:set-payload>
    </dw:transform-message>
</sub-flow>

Upvotes: 0

Salim Khan
Salim Khan

Reputation: 4303

HTH..

%dw 2.0
output application/json
var inp = [
     {
         "Name":"ABC", 
         "ID":"123"
     },
     { 
         "Name":"XYZ", 
         "ID":"345"
     }
    ]
---
inp map {
  ($),
  age:  (23 + ($$)) // or your logic to derive age

}

Upvotes: 2

Related Questions