Подтвердить что ты не робот

RestSharp не десериализует список объектов JSON, всегда Null

У меня возникла проблема с десериализацией возвращаемого содержимого в моих классах RestSharp. Из всех моих поисков кажется, что я делаю это правильно. Я бы предпочел использовать десериализатор RestSharp, чем возвращаться к другому пакету, например Newstonsoft Json.NET.

Что я делаю, так это сделать запрос API для GoToWebinar для всего списка запланированных веб-семинаров:

var client = new RestClient(string.Format("https://api.citrixonline.com/G2W/rest/organizers/{0}/upcomingWebinars", "300000000000239000"));
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "OAuth oauth_token=" + System.Configuration.ConfigurationManager.AppSettings["GoToWebinar"]);
var response2 = client.Execute<List<RootObject>>(request);

Как вы видите, мне бы хотелось получить список объектов "RootObject" (как показано ниже). Я получаю следующий ответ JSON в ответе2.Content:

[
   {
      "webinarKey":678470607,
      "subject":"Easton Wild Rice Cooking Demo",
      "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
      "organizerKey":300000000000239551,
      "times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}],
      "timeZone":"America/Denver"
   },
   {
      "webinarKey":690772063,
      "subject":"Easton Match Making Service",
      "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
      "organizerKey":300000000000239551,
      "times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}],
      "timeZone":"America/Denver"
   }
]

Я создал следующие объекты, используя http://json2csharp.com, используя приведенные выше результаты JSON:

public class RootObject
{
    public int webinarKey { get; set; }
    public string subject { get; set; }
    public string description { get; set; }
    public long organizerKey { get; set; }
    public List<Time> times { get; set; }
    public string timeZone { get; set; }
}

public class Time
{
    public string startTime { get; set; }
    public string endTime { get; set; }
}

Проблема - response2.Data всегда Null. По какой-то причине десериализация потерпела неудачу, и я не знаю почему. Моя цель - использовать цикл foreach для повторения результатов:

foreach(RootObject r in response2.Data)
{
    lblGoToWebinar.Text += r.webinarKey.ToString() + ", ";
}

Любые идеи о том, почему десериализация не работает?

Заранее благодарю вас!

4b9b3361

Ответ 1

Основываясь на приведенном выше предложении @agarcian, я googled ошибка:

restsharp Данные на корневом уровне недопустимы. Строка 1, позиция 1.

и нашел этот форум: http://groups.google.com/group/restsharp/browse_thread/thread/ff28ddd9cd3dde4b

В принципе, я ошибался, чтобы предположить, что client.Execute будет иметь возможность автоматически определять тип возвращаемого контента. Он должен быть установленным:

var request = new RestRequest(Method.GET);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

Это можно было бы более четко указать в документации RestSharp. Надеюсь, это поможет кому-то еще!

Ответ 2

Позднее стороне: вам нужно будет найти фактический Content-Type ответ, который вы получили. Сервер не обязательно отвечает каким-либо из типов контента из вашего заголовка Accept Accept. Для API Google я получил текстовый/обычный ответ, поэтому этот совет из группы работал у меня.

public T Execute<T>(string url, RestRequest request) where T : new()
{
    var client = new RestClient();
    // tell RestSharp to decode JSON for APIs that return "Content-Type: text/plain"
    client.AddHandler("text/plain", new JsonDeserializer());
    ...

Это также более аккуратно, если это можно сделать в одном месте, например, совместно используемый метод Execute, а не форсировать тип ответа с помощью OnBeforeDeserialization везде, где создается каждый запрос.