Nav

Example: Dynamic Mapping Based on a Definition

You can create a transformation that can dynamically change what it does depending on a definition input. This example receives both a payload input, and a variable named mapping that specifies how to rename each field and what default value to use in each.

The example uses the following:

  • A map function to go through all of the elements in the input array. Also a second map function to go through each field in each element.

  • A custom function that applies the changes specified in the mapping variable.

  • default to set a default value, that comes from the mapping variable.

DataWeave

         
      
1
2
3
4
5
6
7
8
9
10
11
%dw 2.0
output application/json
var applyMapping = (input, mappingsDef) -> (
   mappingsDef map (def) -> {
    (def.target) : input[def.source] default def."default"
  }
)
---
payload.sfdc_users.*sfdc_user map (user) -> (
        applyMapping(user, vars.mappings)
)
Input Payload

         
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>
Input Variable mappings

         
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
  {
    "source": "sfdc_name",
    "target": "name",
    "default": "---"
  },
  {
    "source": "sfdc_last_name",
    "target": "lastName",
    "default": "---"
  },
  {
    "source": "sfdc_employee",
    "target": "user",
    "default": true
  }
]
Output JSON

         
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
  [
    {"name": "Mariano"},
    {"lastName": "Achaval"},
    {"user": "true"}
  ],
  [
    {"name": "Julian"},
    {"lastName": "Esevich"},
    {"user": "true"}
  ],
  [
    {"name": "Leandro"},
    {"lastName": "Shokida"},
    {"user": true}
  ]
]

In this topic: