#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. Это ошибка, которую я получаю при попытке сделать это таким образом.