Вложенный Json Проблема, как я могу получить эти данные? - PullRequest
2 голосов
/ 08 апреля 2020

Я пытаюсь получить данные COVID-19 с помощью API, но у меня есть проблема, подобная этой

Вот мой код:

var deserial = new JsonDeserializer();
            var client = new RestClient("https://api.thevirustracker.com/free-api?countryTotals=ALL");
            var request = new RestRequest(Method.GET);
            request.AddHeader("content-type", "application/json");
            var response = client.Execute(request);
            var output = deserial.Deserialize<Dictionary<string, string>>(response);
            var data = output["countryitems"];
            var allData = JsonConvert.DeserializeObject<List<CountryItemViewModel>>(data);

Моя CountryItemViewModel:

public class CountryItemModelView
{
    [JsonProperty("ourid")]
    public long Ourid { get; set; }

    [JsonProperty("title")]
    public string Title { get; set; }

    [JsonProperty("code")]
    public string Code { get; set; }

    [JsonProperty("source")]
    public Uri Source { get; set; }

    [JsonProperty("total_cases")]
    public long TotalCases { get; set; }

    [JsonProperty("total_recovered")]
    public long TotalRecovered { get; set; }

    [JsonProperty("total_unresolved")]
    public long TotalUnresolved { get; set; }

    [JsonProperty("total_deaths")]
    public long TotalDeaths { get; set; }

    [JsonProperty("total_new_cases_today")]
    public long TotalNewCasesToday { get; set; }

    [JsonProperty("total_new_deaths_today")]
    public long TotalNewDeathsToday { get; set; }

    [JsonProperty("total_active_cases")]
    public long TotalActiveCases { get; set; }

    [JsonProperty("total_serious_cases")]
    public long TotalSeriousCases { get; set; }
}

Я могу принять необходимую часть, но не могу принести остальное.

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете объявить дополнительный класс:

public class Data
{
    [JsonProperty("sitedata")]
    public Sitedatum[] Sitedata { get; set; }

    [JsonProperty("countryitems")]
    public Dictionary<string, object>[] Countryitems { get; set; }
}



public class Sitedatum
{
    [JsonProperty("info")]
    public Info Info { get; set; }
}

public class Info
{
    [JsonProperty("source")]
    public Uri Source { get; set; }
}

и десериализовать следующим образом. Обратите внимание, что JSON, возвращаемый из API, имеет ключ / значение "stat": "ok", которое я отбрасываю:

var client = new RestClient("https://api.thevirustracker.com/free-api?countryTotals=ALL");
var request = new RestRequest(Method.GET);
request.AddHeader("content-type", "application/json");
var response = client.Execute(request);
var output = JsonConvert.DeserializeObject<Data>(response.Content);

var counteries = new List<CountryItemModelView>();

foreach(var item in output.Countryitems[0])
{
    if(item.Key != "stat")
    {
        var value = item.Value.ToString();
        counteries.Add(JsonConvert.DeserializeObject<CountryItemModelView>(value));
    }
}
...