Десериализация результата JSON с помощью Json & JavaScriptSerializer - PullRequest
1 голос
/ 30 апреля 2011

вот моя проблема:

Я пытаюсь десериализовать JSON, что не было сделано мной. Формат JSON выглядит следующим образом:

{"responseId":1200,
"availableHotels":[
    {"processId":"HA-84665605","hotelCode":"UKKTLT","availabilityStatus":"InstantConfirmation",...},
    {"processId":"HA-28600965","hotelCode":"UKKTLT","availabilityStatus":"InstantConfirmation",...},
    {"processId":"HI-63991185","hotelCode":"UKJOVF","availabilityStatus":"InstantConfirmation",...}
],
"totalFound":9,
"searchId":"TP-84026455"}

И следующие классы:

  • getAvailableHotelResponse со свойствами:
    • hotelObj availableHotels
    • int totalFound
    • String responseId
    • Строка searchId
  • hotelObj w / properties:
    • отель-отель
  • отель ж / свойства:
    • ProcessId
    • hotelCode
    • availabilityStatus
    • ...

Поэтому, глядя на json, я знаю, что он содержит информацию об объекте getAvailableHotelResponse.

Итак, я попробовал следующее, используя JsonConvert и JavaScriptSerializer:

JavaScriptSerializer ser = new JavaScriptSerializer();
getAvailableHotelResponse availableResponse = ser.Deserialize<getAvailableHotelResponse>(json);
// Exception: "Type 'com.hotelspro.api.getAvailableHotelResponse' is not supported for deserialization of an array"

List<getAvailableHotelResponse> items = ser.Deserialize<List<getAvailableHotelResponse>>(json);
// items.Count = 0

List<getAvailableHotelResponse> result = JsonConvert.DeserializeObject<List<getAvailableHotelResponse>>(json);
// Exception: "Cannot deserialize JSON object into type 'System.Collections.Generic.List`1[com.hotelspro.api.getAvailableHotelResponse]'."

getAvailableHotelResponse result2 = JsonConvert.DeserializeObject<getAvailableHotelResponse>(json);
// Exception: Cannot deserialize JSON array into type 'com.hotelspro.api.hotelObj'.

Какое правильное предложение для десериализации этого объекта?

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Трудно интерпретировать структуру ваших объектов на основе вашего описания, но я смог десериализовать ваш пример JSON, используя следующий минимальный код:

var result = JsonConvert.DeserializeObject<getAvailableHotelResponse>(json);

public class getAvailableHotelResponse
{
    public int responseId;
    public availableHotel[] availableHotels;
    public int totalFound;
    public string searchId;
}

public class availableHotel
{
    public string processId;
    public string hotelCode;
    public string availabilityStatus;
}
0 голосов
/ 30 апреля 2011

Ни один из перечисленных выше объектов не полностью соответствует схеме JSON ... Вы уверены, что кто бы ни сериализировал объект в JSON, использовал какой-либо из тех классов, которые вы пытаетесь десериализовать?Если нет, просто создайте класс, который десериализует JSON:

public class HotelSearchResponse
{
    public int responseID {get;set;}
    public hotel[] availableHotels {get;set;}
    public int totalFound {get;set;}
    public string searchId {get;set;}
}

Если массив hotel не работает, попробуйте List<hotel> вместо типа availableHotels.

PS Ближайший объект к JSON из перечисленных в вашем вопросе - getAvailableHotelResponse, но он объявляет availableHotels как одиночное hotel instace, вместо этого в JSON возвращается массив hotel объектов.

...