skip to Main Content

I’m trying to do a get request, here’s my razor page class:

public class IndexModel : PageModel
{
    public IEnumerable<ApiAnime> ApiData { get; set; } 

    public async Task<IActionResult> OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.aniapi.com/v1/anime");
        var client = _clientFactory.CreateClient();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            var responseStream = await response.Content.ReadAsStreamAsync();

            ApiData = await JsonSerializer.DeserializeAsync<IEnumerable<ApiAnime>>(responseStream);
        }

        else
        {
            ApiData = new List<ApiAnime>();
        }

        return Page();
    }
}

This razor page class seems to work with simpler or more straight forward json values. But with this api "https://api.aniapi.com/v1/anime" it seems to not work.
Now here’s my json class:

public class ApiAnime
{

    public class Rootobject
    {
        public int status_code { get; set; }
        public string message { get; set; }
        public Data data { get; set; }
        public string version { get; set; }
    }

    public class Data
    {
        public int current_page { get; set; }
        public int count { get; set; }
        public Document[] documents { get; set; }
        public int last_page { get; set; }
    }

    public class Document
    {
        public int anilist_id { get; set; }
        public int mal_id { get; set; }
        public int format { get; set; }
        public int status { get; set; }
        public Titles titles { get; set; }
        public Descriptions descriptions { get; set; }
        public DateTime start_date { get; set; }
        public DateTime end_date { get; set; }
        public int season_period { get; set; }
        public int season_year { get; set; }
        public int episodes_count { get; set; }
        public int episode_duration { get; set; }
        public string trailer_url { get; set; }
        public string cover_image { get; set; }
        public string cover_color { get; set; }
        public string banner_image { get; set; }
        public string[] genres { get; set; }
        public int score { get; set; }
        public int id { get; set; }
        public int prequel { get; set; }
        public int sequel { get; set; }
    }
}

The error I get is

The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[AnimDbNet.ApiModel.ApiAnime].
ApiData = await JsonSerializer.DeserializeAsync<IEnumerable<ApiAnime>>(responseStream);

I’m using .NET Core 5.
Does anyone know how to fix this error?

3

Answers


  1. You shouln’t need IEnumerable, this should work by using Rootobject.

    JsonSerializer.DeserializeAsync<Rootobject>(responseStream);
    

    The json sent by this API starts with :

    {
    "status_code": 200,
    "message": "Page 1 contains 100 anime. Last page number is 153 for a total of 15280 anime",
    "data": {
    ...
    

    Which is the start of your root object.

    Login or Signup to reply.
  2. The error is from trying to parse the return value of the API which is not a JSON array but a JSON Object, not an IEnumerable.

     ApiData = await JsonSerializer.DeserializeAsync<IEnumerable<ApiAnime>>(responseStream);
    

    The solution is to parse directly to an ApiAnime.Rootobject and then use the apiData.Data to access the data on your Page.
    Your code would look like this.

    public class IndexModel : PageModel
    {
        public ApiAnime.Rootobject ApiData { get; set; } 
    
    public async Task<IActionResult> OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.aniapi.com/v1/anime");
        var client = _clientFactory.CreateClient();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
    
        var response = await client.SendAsync(request);
    
        if (response.IsSuccessStatusCode)
        {
            var responseStream = await response.Content.ReadAsStreamAsync();
    
            ApiData = await JsonSerializer.DeserializeAsync<ApiAnime.Rootobject>(responseStream);
        }
    
        else
        {
            ApiData = new ApiAnime.Rootobject();
        }
    
        return Page();
     }
    }
    
    Login or Signup to reply.
  3. You don’t need IEnumerable. Try this code. It was tested in Visual Studio and works properly.

    public class IndexModel : PageModel
    {
        public ApiData ApiData { get; set; } 
    
       
      public async Task<IActionResult> OnGet()
      {
    
      var apiDataRoot= await GetApiData(_httpClientFactory);
    
      if (apidatRoot.status_code=200)  ApiData=apiDataRoot.ApiData;
      else ... return error;
      
        return Page();
      }
    }
    

    GetApiData

    public async Task<ApiDataRoot> GetApiData(IHttpClientFactory httpClientFactory)
    {
        var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.aniapi.com/v1/anime");
         var client = httpClientFactory.CreateClient();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
    
        var response = await client.SendAsync(request);
    
        ApiDataRoot apiDataRoot = null;
    
        if (response.IsSuccessStatusCode)
        {
            var responseString = await response.Content.ReadAsStringAsync();
    
            apiDataRoot = System.Text.Json.JsonSerializer.Deserialize<ApiDataRoot>(responseString);
        }
    
        else
        {
            apiDataRoot = new ApiDataRoot {status_code=400, message="error"};
        }
        return apiDataRoot;
    }
    

    classes

    public class ApiData
    {
        public int current_page { get; set; }
        public int count { get; set; }
        public List<Document> documents { get; set; }
        public int last_page { get; set; }
    }
    public class ApiDataRoot
    {
        public int status_code { get; set; }
        public string message { get; set; }
        public ApiData data { get; set; }
        public string version { get; set; }
    }
    public class Titles
    {
        public string en { get; set; }
        public string jp { get; set; }
        public string it { get; set; }
    }
    
    
    public class Descriptions
    {
        public string en { get; set; }
        public string it { get; set; }
    }
    
    public class Document
    {
        public int anilist_id { get; set; }
        public int mal_id { get; set; }
        public int format { get; set; }
        public int status { get; set; }
        public Titles titles { get; set; }
        public Descriptions descriptions { get; set; }
        public DateTime start_date { get; set; }
        public DateTime end_date { get; set; }
        public int season_period { get; set; }
        public int season_year { get; set; }
        public int episodes_count { get; set; }
        public int episode_duration { get; set; }
        public string trailer_url { get; set; }
        public string cover_image { get; set; }
        public string cover_color { get; set; }
        public string banner_image { get; set; }
        public List<string> genres { get; set; }
        public int score { get; set; }
        public int id { get; set; }
        public int? prequel { get; set; }
        public int? sequel { get; set; }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search