Nav

Example: Conditional List Reduction Via a Function

This example flattens the input to something simpler. For each element in the input, it conditionally includes a "contentTypes" field only in case it has any values. It then rearranges this content into a more readable shape.

The example uses these functions:

  • map to go through every element in the input array.

  • reduce to aggregate the multiple elements in the "tags" array into one field.

  • splitBy to parse the values in the "tags" array, so as to only select the first part of each string (through [0]) and discard the second.

  • ++ to concatenate these elements into one single string, with commas as separators.

  • if include the last field only if the "contentTypes" array is bigger than 0.

DataWeave

         
      
1
2
3
4
5
6
7
8
9
10
11
12
%dw 2.0
output application/json
fun
reduceMapFor(data) data reduce(($$ splitBy ":")[0] ++ "," ++ ($ splitBy ":")[0])
---
payload.results map
    {
        email: $.profile.email,
        name: $.profile.firstName,
        tags: reduceMapFor($.data.interests.tags[0]),
        (contenttypes: reduceMapFor($.data.interests.contenttypes[0])) if (sizeOf($.data.interests.contenttypes[0])) > 0
    }
Input JSON

         
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
{
  "results": [
    {
      "profile": {
        "firstName": "john",
        "lastName": "doe",
        "email": "johndoe@demo.com"
      },
      "data": {
        "interests": [
          {
            "language": "English",
            "tags": [
              "digital-strategy:Digital Strategy",
              "innovation:Innovation"
            ],
            "contenttypes": []
          }
        ]
      }
    },
    {
      "profile": {
        "firstName": "jane",
        "lastName": "doe",
        "email": "janedoe@demo.com"
      },
      "data": {
        "interests": [
          {
            "language": "English",
            "tags": [
              "tax-reform:Tax Reform",
              "retail-health:Retail Health"
            ],
            "contenttypes": [
              "News",
              "Analysis",
              "Case studies",
              "Press releases"
            ]
          }
        ]
      }
    }
  ],
  "objectsCount": 2,
  "totalCount": 2,
  "statusCode": 200,
  "errorCode": 0,
  "statusReason": "OK"
}
Output JSON

         
      
1
2
3
4
5
6
7
8
9
10
11
12
13
[
  {
    "email": "johndoe@demo.com",
    "name": "john",
    "tags": "digital-strategy,innovation"
  },
  {
    "email": "janedoe@demo.com",
    "name": "jane",
    "tags": "tax-reform,retail-health",
    "contenttypes": "News,Analysis,Case studies,Press releases"
  }
]

In this topic: