%dw 2.0
output application/json
---
payload.flights map (flight) -> {
(flight mapObject (value, key) -> {
(emptySeats: value) if(key as String == 'availableSeats'),
(airline: value) if(key as String == 'airlineName'),
((key):value) if(key as String !='availableSeats' and key as String != 'airlineName')
})
}
Rename JSON Keys
This DataWeave example renames some keys in a JSON object, while retaining the names of all others in the output.
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 these functions:
-
mapObject
to go through thekey:value
pairs in a JSON object. -
if
by itself to determine when to change the name of a key. -
if
withand
to retain the name of all keys except the two with new names. -
as
to coerce the type of the keys into a String.
{
"flights":[
{
"availableSeats":45,
"airlineName":"Ryan Air",
"aircraftBrand":"Boeing",
"aircraftType":"737",
"departureDate":"12/14/2017",
"origin":"BCN",
"destination":"FCO"
},
{
"availableSeats":15,
"airlineName":"Ryan Air",
"aircraftBrand":"Boeing",
"aircraftType":"747",
"departureDate":"08/03/2017",
"origin":"FCO",
"destination":"DFW"
}]
}
[
{
"emptySeats": 45,
"airline": "Ryan Air",
"aircraftBrand": "Boeing",
"aircraftType": "737",
"departureDate": "12/14/2017",
"origin": "BCN",
"destination": "FCO"
},
{
"emptySeats": 15,
"airline": "Ryan Air",
"aircraftBrand": "Boeing",
"aircraftType": "747",
"departureDate": "08/03/2017",
"origin": "FCO",
"destination": "DFW"
}
]
A more maintainable way to produce the same output uses DataWeave pattern matching.
The example uses the following functions and statements:
-
mapObject
to go through thekey:value
pairs in a JSON object. -
match
on each key in the input. -
case
statements to change the name of matching keys in the input. -
else
statement to retain the name of keys that do not require a name change.
%dw 2.0
output application/json
fun renameKey(key: Key) = key match {
case "availableSeats" -> "emptySeats"
case "airlineName" -> "airline"
else -> (key)
}
---
payload.flights map (flight) ->
flight mapObject (value, key) -> {
(renameKey(key)) : value
}
{
"flights":[
{
"availableSeats":45,
"airlineName":"Ryan Air",
"aircraftBrand":"Boeing",
"aircraftType":"737",
"departureDate":"12/14/2017",
"origin":"BCN",
"destination":"FCO"
},
{
"availableSeats":15,
"airlineName":"Ryan Air",
"aircraftBrand":"Boeing",
"aircraftType":"747",
"departureDate":"08/03/2017",
"origin":"FCO",
"destination":"DFW"
}]
}
[
{
"emptySeats": 45,
"airline": "Ryan Air",
"aircraftBrand": "Boeing",
"aircraftType": "737",
"departureDate": "12/14/2017",
"origin": "BCN",
"destination": "FCO"
},
{
"emptySeats": 15,
"airline": "Ryan Air",
"aircraftBrand": "Boeing",
"aircraftType": "747",
"departureDate": "08/03/2017",
"origin": "FCO",
"destination": "DFW"
}
]