Погрузите stackexchange Api, используя asp.net mvc - PullRequest
0 голосов
/ 23 января 2019

Я хочу использовать API StackExchange в моем приложении ASP.Net.

Я сделал модель, контроллер и вид, но он не работает. Он продолжает давать мне следующую ошибку:

Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [TaskTrial2.Models.question] потому что для десериализации типа требуется массив JSON (например, [1,2,3]) правильно.

Модель

public class question
{
    public List<string> tags { get; set; }
    public string link { get; set; }
    public owner owner { get; set; }
    public bool is_answered { get; set; }
    public long view_count { get; set; }
    public string last_activity_date { get; set; }
    public long score { get; set; }
    public long answer_count { get; set; }
    public string creation_date { get; set; }
    public string question_id { get; set; }
    public string title { get; set; }




}
public class owner {
    public string user_id { get; set; }
    public string reputation { get; set; }
    public string user_type  { get; set; }
    public string profile_image { get; set; }
    public string display_name { get; set; }
    public string link { get; set; }

}

Контроллер

    public ActionResult Index()
    {

        List<question> questions = null;

        HttpClientHandler handler = new HttpClientHandler();
        handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        using (var Client = new HttpClient(handler))
        {
            Client.BaseAddress = new Uri("https://api.stackexchange.com/");
            //HTTP GET
            Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/jason"));
            var response = Client.GetAsync("2.2/questions?site=stackoverflow");
            response.Wait();
            var result = response.Result;

            if (result.IsSuccessStatusCode)
            {
                var readTask = result.Content.ReadAsAsync<List<question>>();
                readTask.Wait();
                questions = readTask.Result;


            }

        }

        return View(questions);
    }

View

@model IEnumerable<TaskTrial2.Models.question>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
   }


<table cellpadding="2" cellspacing="2" border="0">
<tr>

    <th>link</th>

</tr>

@foreach (var item in Model)
{

    <tr>
        <td>
            @item.link
        </td>

    </tr>

}

1 Ответ

0 голосов
/ 25 января 2019

Вы пытаетесь напрямую сериализоваться в список вопросов, когда ваш запрос сначала получает упаковку для вопросов

public class StackResponseWrapper
{
    public List<Question> items { get; set;}
    public bool has_more {get; set; }
    public int quota_max { get; set; }
    public int quota_remaining { get; set; }
}

Я не исследовал структуру ответов, но я предполагаю, что это оболочка для нумерации страниц, которую можно сделать общей, например (StackResponseWrapper<Question>), но я позволю вам изучить.

Главное при десериализации json - убедиться, что структура соответствует тому, что вы пытаетесь десериализовать до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...