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

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?

Answers


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.


Need Your Help

IPv6 Link-Local Multicast on Twisted

sockets twisted ipv6 multicast

I am trying to write the same Ping-Pong Multicast-Example on Twisted-Example-Page. Though the Example works on IPv4 addresses for multicast-group, I replaced the line

bash loop with GNU less that refreshes every 2 minutes

linux bash background-process gnu-parallel less-unix

I have a linux machine with a data folder and a script that produces a report xlsx spreadsheet file on the ever changing content of the folder where it is being run. I use a xlsx2tsv script to conv...