I have two input payloads like object [single record] and Array [Multiple records]. I am able to handle single record [object] scenario
Object Payload
{
"apiName": "api",
"apiVersion": "V1",
"apiStatus": true,
"apiMessage": "Success Message",
"inboundCorrelationId": "0035",
"timestamp": "2024-04-30T19:53:35.584+05:30",
"httpStatus": "200",
"apiData": {
"Reservations": {
"Brand": {
"Code": "TL",
"Id": "50136",
"Name": "Travelodge"
},
"Chain": {
"Code": "WHG",
"Id": "5136",
"Name": "Wyndham Hotel Group"
},
"Guests": {
"PersonName": {
"GivenName": "Mya",
"Surname": "Randolph"
},
"CRS_referenceNumber": "84572GY004389",
"Role": "Primary",
"MarketingOptIn": "false"
},
"Currency": {
"Name": "US Dollars",
"Symbol": "$",
"Code": "USD"
},
"Hotel": {
"Id": "84572",
"Code": "12192",
"Name": "Christian Travelodge Training"
},
"Language": {
"Code": "en-US",
"LangId": "0",
"Name": "Default"
},
"RoomStay": {
"GuestCount": {
"AgeQualifyingCode": "Child",
"NumGuests": "0"
},
"GuestCount1": {
"AgeQualifyingCode": "Adult",
"NumGuests": "2"
},
"NumRooms": "1",
"EndDate": "2024-04-24T00:00:00",
"CheckOutDate": "2024-04-24T09:50:33",
"Group": "false",
"Suppressed": "false",
"Products": {
"Product": {
"RateCode": "RROD",
"RoomCode": "NQQ1",
"Id": "dd6ad2c1-4f67-49d1-ba1b-c82219157477",
"RoomUnit": "210"
},
"StartDate": "2024-04-23T00:00:00",
"EndDate": "2024-04-24T00:00:00",
"Primary": "true"
}
},
"ModificationPermitted": "false",
"CancellationPermitted": "false",
"CRS_confirmationNumber": "84572CY003780",
"ItineraryNumber": "5136B2042316",
"SortOrder": "0",
"CRSConfirmationNumber": "84572CY003780",
"Channels": {
"PrimaryChannel": {
"Code": "PMS",
"Description": "PMS"
},
"SecondaryChannel": {
"Code": "PMS",
"Description": "PMS"
}
},
"Content": {
"Rooms": {
"Name": "2 Queen Beds, Non-Smoking"
},
"RateCategories": {
"Description": "1A Last Room Available & RROD",
"CategoryCode": "1A",
"Name": "1A Last Room Available & RROD"
},
"Rates": {
"Description": "Travelodge Daily Rate",
"DisplayName": "Best Available Rate",
"CategoryCode": "1A",
"Code": "RROD",
"rateName": "Best Available Rate",
"rateStatus": "Active"
}
}
},
"Pagination": {
"Size": "1"
}
}
}
Please find working DW logic for single above payload. Adding additional data under Content.Rates
%dw 2.0
output application/json
var rateAccessCodeData = {
"CroAccessInfos": [
{
"code": "WHG",
"readOnly": true
}
],
"VaAccessInfo": {
"restrictVaAccess": true
},
"rateCode": "RICKRATEAE",
"rateName": "Rick Rate AutoEnroll",
"rateStatus": "Active"
}
var content = payload.apiData.Reservations.Content
var rates = content.Rates
var payloadWithoutContent = payload.apiData.Reservations -- ["field", "Content"]
var contentWithoutRates = content -- ["field", "Rates"]
var updatedRates = "Rates": rates ++ rateAccessCodeData
var updatedContent = "Content": contentWithoutRates ++ updatedRates
---
"Reservations": payloadWithoutContent ++ updatedContent
When I am receiving multiple records [Array] scenario my dataweave logic is failing.
Array Payload
{
"apiName": "api",
"apiVersion": "V1",
"apiStatus": true,
"apiMessage": "Success Message",
"inboundCorrelationId": "0985035",
"timestamp": "2024-04-30T19:53:35.584+05:30",
"httpStatus": "200",
"apiData": {
"Reservations": [
{
"Brand": {
"Code": "TL",
"Id": "50136",
"Name": "Travelodge"
},
"Chain": {
"Code": "WHG",
"Id": "5136",
"Name": "Wyndham Hotel Group"
},
"Guests": {
"PersonName": {
"GivenName": "Mya",
"Surname": "Randolph"
},
"CRS_referenceNumber": "84Y004389",
"Role": "Primary",
"MarketingOptIn": "false"
},
"Currency": {
"Name": "US Dollars",
"Symbol": "$",
"Code": "USD"
},
"Hotel": {
"Id": "84572",
"Code": "12192",
"Name": "Christian Travelodge Training"
},
"Language": {
"Code": "en-US",
"LangId": "0",
"Name": "Default"
},
"RoomStay": {
"GuestCount": {
"AgeQualifyingCode": "Child",
"NumGuests": "0"
},
"GuestCount1": {
"AgeQualifyingCode": "Adult",
"NumGuests": "2"
},
"NumRooms": "1",
"EndDate": "2024-04-24T00:00:00",
"CheckOutDate": "2024-04-24T09:50:33",
"Group": "false",
"Suppressed": "false",
"Products": {
"Product": {
"RateCode": "RROD",
"RoomCode": "NQQ1",
"Id": "dd477",
"RoomUnit": "210"
},
"StartDate": "2024-04-23T00:00:00",
"EndDate": "2024-04-24T00:00:00",
"Primary": "true"
}
},
"ModificationPermitted": "false",
"CancellationPermitted": "false",
"CRS_confirmationNumber": "8403780",
"ItineraryNumber": "5136B2042316",
"SortOrder": "0",
"CRSConfirmationNumber": "84573780",
"Channels": {
"PrimaryChannel": {
"Code": "PMS",
"Description": "PMS"
},
"SecondaryChannel": {
"Code": "PMS",
"Description": "PMS"
}
},
"Content": {
"Rooms": {
"Name": "2 Queen Beds, Non-Smoking"
},
"RateCategories": {
"Description": "1A Last Room Available & RROD",
"CategoryCode": "1A",
"Name": "1A Last Room Available & RROD"
},
"Rates": [
{
"Description": "Travelodge Daily Rate",
"DisplayName": "Best Available Rate",
"CategoryCode": "1A",
"Code": "RROD",
"rateName": "Best Available Rate",
"rateStatus": "Active"
}
]
}
}
],
"Pagination": {
"Size": "1"
}
}
}
Can someone help me write the dataweave code?
%dw 2.0
output application/json
import * from dw::core::Arrays
var rateAccessCodeData = {
"CroAccessInfos": [
{
"code": "WHG",
"readOnly": true
}
],
"VaAccessInfo": {
"restrictVaAccess": true
},
"rateCode": "RICKRATEAE",
"rateName": "Rick Rate AutoEnroll",
"rateStatus": "Active"
}
fun handleRates(rates) = rates match {
case is Array -> rates map ((rate) -> rate ++ rateAccessCodeData)
else -> rates ++ rateAccessCodeData
}
var content = payload.apiData.Reservations.Content
var rates = content.Rates
var payloadWithoutContent = payload.apiData.Reservations -- ["Content"]
var contentWithoutRates = content -- ["Rates"]
var updatedRates = { "Rates": handleRates(rates) }
var updatedContent = { "Content": contentWithoutRates + updatedRates }
---
{ "Reservations": payloadWithoutContent ++ updatedContent }
New contributor
SPs is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.