How to convert this type of json response into User defined types

api, c#, json, user-defined-types, web-services

Solution

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);
    }
}

Problem

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?

Original source