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
%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
{
"results": [
{
"profile": {
"firstName": "john",
"lastName": "doe",
"email": "[email protected]"
},
"data": {
"interests": [
{
"language": "English",
"tags": [
"digital-strategy:Digital Strategy",
"innovation:Innovation"
],
"contenttypes": []
}
]
}
},
{
"profile": {
"firstName": "jane",
"lastName": "doe",
"email": "[email protected]"
},
"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
[
{
"email": "[email protected]",
"name": "john",
"tags": "digital-strategy,innovation"
},
{
"email": "[email protected]",
"name": "jane",
"tags": "tax-reform,retail-health",
"contenttypes": "News,Analysis,Case studies,Press releases"
}
]