ASP. Net Core Import JSON из внешнего API - PullRequest
3 голосов
/ 22 марта 2020

Я новичок в обоих. NET Базовый дом, кто-то может мне помочь в этом.

Мне нужно сделать запрос на этот URL и сохранить данные в базе данных: url: https://covid19.mathdro.id/api

JSON вывод выглядит следующим образом:

{"confirmed":{"value":303001,"detail":"https://covid19.mathdro.id/api/confirmed"},"recovered":{"value":91669,"detail":"https://covid19.mathdro.id/api/recovered"},"deaths":{"value":12762,"detail":"https://covid19.mathdro.id/api/deaths"},"dailySummary":"https://covid19.mathdro.id/api/daily","dailyTimeSeries":{"pattern":"https://covid19.mathdro.id/api/daily/[dateString]","example":"https://covid19.mathdro.id/api/daily/2-14-2020"},"image":"https://covid19.mathdro.id/api/og","source":"https://github.com/mathdroid/covid19","countries":"https://covid19.mathdro.id/api/countries","countryDetail":{"pattern":"https://covid19.mathdro.id/api/countries/[country]","example":"https://covid19.mathdro.id/api/countries/USA"},"lastUpdate":"2020-03-21T20:13:21.000Z"}

Модель: итоги

public class Total
{
    [Key]
    public int Id { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Confirmed { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Recovered { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Deaths { get; set; }
    [Column(TypeName = "datetime2")]
    [Required]
    public string LastUpdated { get; set; }
}

Моя модель импорта:

client.BaseAddress = new Uri("https://covid19.mathdro.id/api");
var response = await client.GetAsync($"");
response.EnsureSuccessStatusCode();
var stringResult = await response.Content.ReadAsStringAsync();

Я застрял отсюда и не могу продолжать. Как мне получить данные, мне нужно только: подтвержденные, восстановленные, смерти и lastUpdate

Pls. кто-нибудь помочь здесь ...

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Вам нужно разыграть JSON до Class Object. Вы можете получить свои данные, как это, используя NewtonSoft.Json

using (var client = new HttpClient())
{
  string url = string.Format("https://covid19.mathdro.id/api");
  var response = client.GetAsync(url).Result;

  string responseAsString = await response.Content.ReadAsStringAsync();
  result = JsonConvert.DeserializeObject<CovidResult>(responseAsString);
}

public class CovidResult
{
   [JsonProperty("confirmed")]
   public ValueModel Confirmed { get; set; }
   [JsonProperty("recovered")]
   public ValueModel Recovered { get; set; }
   [JsonProperty("deaths")]
   public ValueModel Deaths { get; set; }
}

public class ValueModel
{
   [JsonProperty("value")]
   public int Value { get; set; }
}

Вы можете разветвить или скачать этот репо: https://github.com/fatihyildizhan/CoronaParser

3 голосов
/ 22 марта 2020

Ваш модальный должен быть

public class Total
{
    public Confirmed confirmed { get; set; }
    public Recovered recovered { get; set; }
    public Deaths deaths { get; set; }
    public string dailySummary { get; set; }
    public DailyTimeSeries dailyTimeSeries { get; set; }
    public string image { get; set; }
    public string source { get; set; }
    public string countries { get; set; }
    public CountryDetail countryDetail { get; set; }
    public DateTime lastUpdate { get; set; }
}

public class Confirmed
{
    public int value { get; set; }
    public string detail { get; set; }
}

public class Recovered
{
    public int value { get; set; }
    public string detail { get; set; }
}

public class Deaths
{
    public int value { get; set; }
    public string detail { get; set; }
}

public class DailyTimeSeries
{
    public string pattern { get; set; }
    public string example { get; set; }
}

public class CountryDetail
{
    public string pattern { get; set; }
    public string example { get; set; }
}

Если stringResult имеет фактическое значение, все, что вам нужно сделать, это:

JsonConvert.DeserializeObject<Total>(stringResult);

Также, если вы сомневаетесь в модале, вы всегда можете используйте http://json2csharp.com/

1 голос
/ 22 марта 2020

Я предлагаю вам использовать JSon. NET он же Newtonsoft. Вы можете добавить его из диспетчера пакетов nuget. Вот код для сопоставления входящих json данных с вашим пользовательским классом Total. просто добавьте свой конструктор класса, который будет принимать json данные в качестве аргумента, который является строкой typeof, и я добавил один метод, чтобы сделать код короче

public class Total {

    public Total(string json) {
        JObject jObject = JObject.Parse(json);
        Confirmed = GetStringFromJToken(jObject, "confirmed");
        Recovered = GetStringFromJToken(jObject, "recovered");
        Deaths = GetStringFromJToken(jObject, "deaths");

        LastUpdated = (string)jObject["lastUpdate"];
    }

    private string GetStringFromJToken(JObject jObject, string key) {
        JToken keyToken = jObject[key];
        return (string)keyToken["value"];
    }

    [Key]
    public int Id { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Confirmed { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Recovered { get; set; }
    [Column(TypeName = "int")]
    [Required]
    public string Deaths { get; set; }
    [Column(TypeName = "datetime2")]
    [Required]
    public string LastUpdated { get; set; }
}
...