Newtonsoft.Json.Исключение JsonSerializationException: ‘Не удается десериализовать текущий массив JSON

#c# #.net #json #api #console

#c# #.net #json #API #консоль

Вопрос:

Я новичок в API, и последние пару дней я практиковался в использовании готовых из github и тому подобного. Теперь я решил попробовать создать свое собственное приложение для отслеживания коронавируса (довольно оригинальное). Я столкнулся с названной проблемой и не нашел в Интернете решения о том, как это исправить. Я предполагаю, что JSON, который я пытаюсь получить (https://api.covid19api.com/live/country/germany ) — это массив, и я не могу заставить его работать. Я пробовал то же самое на JSON без массива (reddit’s), и это работает как шарм. Весь код и классы вставлены ниже, и спасибо всем, кто нашел время прочитать это и решил помочь.

Newtonsoft.Json.JsonSerializationException: ‘Не удается десериализовать текущий массив JSON (например, [1,2,3]) в тип ‘Covid.Api.CovidStats’, поскольку для правильного десериализации типа требуется объект JSON (например, {«name»:»value»}). Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {«name»:»value»}), либо измените десериализованный тип на массив или тип, который реализует интерфейс сбора (например, ICollection, IList), подобный списку, который может быть десериализован из массива JSON. Атрибут JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON. Путь «, строка 1, позиция 1.’

 using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;


namespace Covid.Api
{


public class CovidClient
{

    public async Task<CovidStats> GetByCountryLiveStats(string country,DateTime startDate,DateTime endDate)
    {
        var url = $"https://api.covid19api.com/country/{country}/status/confirmed/live?from={startDate}amp;to={endDate}";
        var client = new HttpClient();
        var response = await client.GetStringAsync(url);
        return JsonConvert.DeserializeObject<CovidStats>(response);
        
    }

}

public class CovidStats
{ 
    [JsonProperty("Country")]
    public string Country { get; set; }
    [JsonProperty("Cases")]
    public int Cases { get; set; }
    [JsonProperty("Status")]
    public string Status { get; set; }
    [JsonProperty("Date")]
    public DateTime date { get; set; }
}
public class CovidList
{
    List<CovidStats> lista { get; set; }
}


}
  

Ответ №1:

API возвращает список<T>, а не отдельный объект, поэтому вам необходимо обновить строку десериализации:

 return JsonConvert.DeserializeObject<List<CovidStats>>(response);
  

Обновить:

Для полноты картины вам также потребуется обновить возвращаемый тип метода. Полный код ниже:

 public static async Task<List<CovidStats>> GetByCountryLiveStats(string country, DateTime startDate, DateTime endDate)
{
   var url =  $"https://api.covid19api.com/country/{country}/status/confirmed/live?from= {startDate}amp;to={endDate}";
   var client = new HttpClient();
   var response = await client.GetStringAsync(url);
   return JsonConvert.DeserializeObject<List<CovidStats>>(response);
}
  

Комментарии:

1. Спасибо, что взглянули на проблему! Я попытался реализовать ваше предложение, и я предполагаю, что это я глупый, но это все еще вызывает ошибку. Я пытался сделать это вот так: JsonConvert.DeserializeObject<List<CovidList>(response);

2. Я пробовал это так: JsonConvert.DeserializeObject<List<CovidStats>>(response); но все еще получаю ошибку. Не удается неявно преобразовать тип System. Коллекции. Generic.List<Covid.Api>CovidStats> в Covid.Api>CovidStats.

3. @Citrus вы пропустили, чтобы изменить Task<CovidStats> на Task<List<CovidStats>>

4. @Sajid не может в это поверить. Самая очевидная вещь, и мой мозг пропустил это, но это кодирование, я думаю. Вы правы. Теперь все работает как по волшебству. Большое спасибо.

Ответ №2:

Попробуйте это

 JsonConvert.DeserializeObject<CovidList>(response);
  

Комментарии:

1. Не удается неявно преобразовать тип System. Коллекции. Generic.List<Covid.Api>CovidStats> в Covid.Api.CovidStats. Это ошибка, которую я получаю при попытке сделать это таким образом.