%dw 2.0 output application/json var applyMapping = (in, mappingsDef) -> ( mappingsDef map (def) -> { (def.target) : in[def.source] default def."default" } ) --- payload.sfdc_users.*sfdc_user map (user) -> ( applyMapping(user, vars.mappings) )
Dynamically Map Based on a Definition
You can create a transformation that can dynamically change what it does depending on a definition input. This DataWeave example receives both a payload input, and a variable named mappings
that specifies how to rename each field and what default value to use in each.
Before you begin, note that DataWeave version 2 (%dw 2.0
) is for Mule 4 apps. For a
Mule 3 app, refer to DataWeave version 1
(%dw 1.0
) examples,
within the Mule 3.9 documentation set. For other Mule versions, you can use
the Mule Runtime version selector in the table of contents.
The example uses the following:
-
A
map
function to go through all of the elements in the input array. Also a secondmap
function to go through each field in each element. -
A custom function that applies the changes specified in the
mappings
variable. -
default
to set a default value, that comes from themappings
variable.
<sfdc_users>
<sfdc_user>
<sfdc_name>Mariano</sfdc_name>
<sfdc_last_name>Achaval</sfdc_last_name>
<sfdc_employee>true</sfdc_employee>
</sfdc_user>
<sfdc_user>
<sfdc_name>Julian</sfdc_name>
<sfdc_last_name>Esevich</sfdc_last_name>
<sfdc_employee>true</sfdc_employee>
</sfdc_user>
<sfdc_user>
<sfdc_name>Leandro</sfdc_name>
<sfdc_last_name>Shokida</sfdc_last_name>
</sfdc_user>
</sfdc_users>
vars.mappings
):[
{
"source": "sfdc_name",
"target": "name",
"default": "---"
},
{
"source": "sfdc_last_name",
"target": "lastName",
"default": "---"
},
{
"source": "sfdc_employee",
"target": "user",
"default": true
}
]
[
[
{"name": "Mariano"},
{"lastName": "Achaval"},
{"user": "true"}
],
[
{"name": "Julian"},
{"lastName": "Esevich"},
{"user": "true"}
],
[
{"name": "Leandro"},
{"lastName": "Shokida"},
{"user": true}
]
]