Отображение класса на самый необычный объект и отображение данных ответа - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь отобразить и отобразить ответ на класс из Unirest с .NET. Я следовал этому примеру в стеке: Преобразование тела ответа http в формат JSON с использованием Unirest C #

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

Мой код:

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

1 Ответ

0 голосов
/ 02 апреля 2019

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

  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. Поскольку автор Я подозреваю, что первое, но сайт проекта указывает на githubraw второго.
  3. Когда мы используем pdb для отладки оригинальной сборки, исходный код не может быть привязан по критическому пути, что означает, что что-то не так.
  4. Если мы скопируем исходный код из второго в проект, он будет работать

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

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

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

        else if (typeof (Stream).GetType().IsAssignableFrom(typeof (T).GetType()))
        {
          this.Body = (T) this.Raw;
        }
...