Сопоставление класса с объектом unirest и отображение данных ответа

Я пытаюсь отобразить и сопоставить ответ классу Unirest с .NET. Я следовал этому примеру в стеке: https://stackoverflow.com/questions/31515751/convert-the-http-response-body-to-json-format-using-unirest-c-sharp

Однако при его запуске я получаю сообщение об ошибке «Невозможно преобразовать объект типа «System.IO.MemoryStream» в тип «Корневой объект».

Мой код:

protected void Button1_Click(object sender, EventArgs e)
{
    HttpResponse<JobSearchFeed.RootObject> jsonResponse = Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY&v=2&l=California&q=javascript")
    .header("X-Mashape-Key", "MY_KEY")
    .header("Accept", "application/json")
    .asJson<JobSearchFeed.RootObject>();
}

Я также осмотрелся и обнаружил, что мне нужно использовать его как «Задачу», но я не уверен, что это вообще собирает какие-либо данные.

Мой код для этого:

static async Task<JobSearchFeed.RootObject> GetRootInfo()
{
   HttpResponse<JobSearchFeed.RootObject> jsonResponse = await Unirest.get("http://api.indeed.com/ads/apisearch?publisher=PUBLISHER_KEY&v=2&l=California&q=javascript")
    .header("X-Mashape-Key", "MY_KEY")
    .header("Accept", "application/json")
    .asJsonAsync<JobSearchFeed.RootObject>();
    return jsonResponse.Body;
}

Мои занятия:

public class JobSearchFeed
{
     public class Result
        {
            public string jobtitle { get; set; }
            public string company { get; set; }
            public string city { get; set; }
            public string state { get; set; }
            public string country { get; set; }
            public string language { get; set; }
            public string formattedLocation { get; set; }
            public string source { get; set; }
            public string date { get; set; }
            public string snippet { get; set; }
            public string url { get; set; }
            public string onmousedown { get; set; }
            public string jobkey { get; set; }
            public bool sponsored { get; set; }
            public bool expired { get; set; }
            public bool indeedApply { get; set; }
            public string formattedLocationFull { get; set; }
            public string formattedRelativeTime { get; set; }
            public string stations { get; set; }
        }

        public class RootObject
        {
            public int version { get; set; }
            public string query { get; set; }
            public string location { get; set; }
            public string paginationPayload { get; set; }
            public int radius { get; set; }
            public bool dupefilter { get; set; }
            public bool highlight { get; set; }
            public int totalResults { get; set; }
            public int start { get; set; }
            public int end { get; set; }
            public int pageNumber { get; set; }
            public List<Result> results { get; set; }
        }
}

person User9210231    schedule 01.05.2018    source источник


Ответы (1)


Ответить сложно, потому что за проектом непросто следить. Позвольте мне следовать пути решения:

  1. Пакет NuGet довольно старый и предназначен для старой NET Framework 4.0 — в NET Framework мало изменений по сравнению с 4.0. Я не знаю, какую цель вы используете, но я уверен, что более новая. Проверьте https://www.nuget.org/packages/Unirest-API/ для всех спецификаций.
  2. Если мы проверим исходный проект, их будет 3, и трудно сказать, какой из них правильный: https://github.com/zeeshanejaz/unirest-net, https://github.com/apimatic/unirest-net или https://github.com/Kong/unirest-net . Потому что автор nuget подозреваю первого, но сайт проекта указывает на githubraw второго.
  3. Когда мы используем pdb для отладки оригинальной сборки, исходный код не может привязаться к критическому пути, а это означает, что что-то не так.
  4. Если мы скопируем исходный код из второго в проект, он работает

Я предлагаю следующее:

  1. Скопируйте исходный код библиотеки в свой проект — библиотека небольшая и не обновлялась до 2015 года, так что это не должно быть большой проблемой.
  2. Вместо того, чтобы использовать неподдерживаемую библиотеку, сделайте это самостоятельно с помощью HttpClient и JsonConvert. Это будет точно так же для вас, и вы пропускаете проблему

Строки с проблемой - каким-то образом код входит в это состояние и пытается плохо преобразовать объект:

        else if (typeof (Stream).GetType().IsAssignableFrom(typeof (T).GetType()))
        {
          this.Body = (T) this.Raw;
        }
person Piotr Stapp    schedule 02.04.2019