I am using a web service which returns data into JSON in following format
{
"responseId": 2933574,
"availableHotels": [
{
"processId": "HC-65870953",
"hotelCode": "UKI9E6",
"availabilityStatus": "InstantConfirmation",
"totalPrice": 971,
"totalTax": 0,
"totalSalePrice": 0,
"currency": "EUR",
"boardType": "Bed & Continental Breakfast",
"rooms": [
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "6"
}
],
"totalRoomRate": 486,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 163
},
{
"date": "2012-07-21",
"amount": 163
},
{
"date": "2012-07-22",
"amount": 160
},
{
"date": "2012-07-23",
"amount": 0
}
]
},
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "8"
}
],
"totalRoomRate": 485,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 163
},
{
"date": "2012-07-21",
"amount": 163
},
{
"date": "2012-07-22",
"amount": 160
},
{
"date": "2012-07-23",
"amount": -1
}
]
}
]
},
{
"processId": "HH-22003963",
"hotelCode": "UKPDNN",
"availabilityStatus": "InstantConfirmation",
"totalPrice": 1085,
"totalTax": 0,
"totalSalePrice": 0,
"currency": "EUR",
"boardType": "Bed and Breakfast",
"rooms": [
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "6"
}
],
"totalRoomRate": 544,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 136
},
{
"date": "2012-07-21",
"amount": 136
},
{
"date": "2012-07-22",
"amount": 136
},
{
"date": "2012-07-23",
"amount": 136
}
]
},
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "8"
}
],
"totalRoomRate": 541,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 136
},
{
"date": "2012-07-21",
"amount": 136
},
{
"date": "2012-07-22",
"amount": 136
},
{
"date": "2012-07-23",
"amount": 133
}
]
}
]
}
],
"totalFound": 2,
"searchId": "QG-67623913"
}
Now I have a class defined as following:
public class getAvailableHotelResponse
{
public getAvailableHotelResponse();
public hotel[] availableHotels { get; set; }
[SoapElement(DataType = "integer")]
public string responseId { get; set; }
public string searchId { get; set; }
[SoapElement(DataType = "integer")]
public string totalFound { get; set; }
}
And the hotel
class is as follows:
public class hotel
{
public hotel();
public string availabilityStatus { get; set; }
public string boardType { get; set; }
public string currency { get; set; }
public string hotelCode { get; set; }
public string processId { get; set; }
public roomResponse[] rooms { get; set; }
[SoapElement(DataType = "integer")]
public string specialDeal { get; set; }
public float totalPrice { get; set; }
[SoapIgnore]
public bool totalPriceSpecified { get; set; }
public float totalSalePrice { get; set; }
[SoapIgnore]
public bool totalSalePriceSpecified { get; set; }
public float totalTax { get; set; }
[SoapIgnore]
public bool totalTaxSpecified { get; set; }
}
And the roomResponse
class is as follows:
public class roomResponse
{
public roomResponse();
public pax[] paxes { get; set; }
public dailyRate[] ratesPerNight { get; set; }
public string roomCategory { get; set; }
public float totalRoomRate { get; set; }
[SoapIgnore]
public bool totalRoomRateSpecified { get; set; }
}
And pax
class is as follows:
public class pax
{
public pax();
[SoapElement(DataType = "integer")]
public string age { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string paxType { get; set; }
public string title { get; set; }
}
And dailyRate
class is as follows:
public class dailyRate
{
public dailyRate();
public float amount { get; set; }
[SoapIgnore]
public bool amountSpecified { get; set; }
[SoapElement(DataType = "date")]
public DateTime date { get; set; }
[SoapIgnore]
public bool dateSpecified { get; set; }
}
Edit
getAvailableHotelResponse h = new getAvailableHotelResponse();
h = (getAvailableHotelResponse)Newtonsoft.Json.JsonConvert.DeserializeObject(text);
I tried this and it's throwing the following error:
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'hotelspro.getAvailableHotelResponse'.
There is a really complex structure of JSON, so how do I convert this to my objects?
Remove non-compilable constructors like public pax();
and just use
var availHotels = JsonConvert.DeserializeObject<getAvailableHotelResponse>(text);
that's all.
In fact, you wouldn't even need to declare this bunch of classes(getAvailableHotelResponse
, hotel
,roomResponse
,pax
,dailyRate
etc.) if you made use of dynamic. For ex,
dynamic response = Newtonsoft.Json.JsonConvert.DeserializeObject(text);
foreach (var hotel in response.availableHotels)
{
Console.WriteLine(hotel.processId);
foreach (var room in hotel.rooms)
{
Console.WriteLine("\t" + room.roomCategory);
}
}
Most of the time when I work on frameworks that provide response, they have at the VERY least a standardized response.
And what response may be generic, but I know what to expect. So it's not uncommon to receive a broad response such as:
{
'data': 'JSON-blah-JSON-blah-IneedAcocktail-JSON-blah',
'status': 200,
'fortune': 'shakeHarder'
}
Understanding that generic response and then using it to reflect what you need later might be the case.
For instance, all of the objects you're receiving are objects you already use. There might be things like a pax number you don't know normally..inherit it and the other standardized random things that don't need to conflict.
Then create a container class that encompasses the object you need. Perhaps you need to translate it into your formatting; but at least you have it in the format you know how to work with and you're not parsing strings until you're blue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With