Почему данные веб-API, десериализованные из json, возвращаются как нулевые и не отображаются на экране? - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в сериализации и десериализации JSON, в настоящее время пытаюсь десериализовать набор данных из вызова Web API. Данные видны до десериализации, но когда они отправляются в представление, они показывают «ноль».

Модель:

public class Currency
{
    public string Rates { get; set; }
}

Контроллер:

public class CurrencyController:Controller
{ 
    string Baseurl = "https://api.exchangeratesapi.io/";

    public async Task<ActionResult> Index()
    {
        Currency CurencyInfo = new Currency();

        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(Baseurl);
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage Result = await client.GetAsync("https://api.exchangeratesapi.io/latest");

            if (Result.IsSuccessStatusCode)
            {
                // Storing the response details received from Web API 
                var CurrencyResponse = Result.Content.ReadAsStringAsync().Result;

                // Deserializing the response received from Web API and storing into the CurrencyInfo 
                CurencyInfo = JsonConvert.DeserializeObject<Currency>((JObject.Parse(CurrencyResponse)["rates"]).ToString());
            }

            // returning the Currency Info to view  
            return View(CurencyInfo);
        }
    }
}

1 Ответ

0 голосов
/ 23 октября 2019

Ваш класс валюты неверен. Он не включает все свойства для привязки. Глядя на результат JSON, возвращаемый https://api.exchangeratesapi.io/latest

Ваш класс Currency должен быть следующим:

public class Rates
{
    public double CAD { get; set; }
    public double HKD { get; set; }
    public double ISK { get; set; }
    public double PHP { get; set; }
    public double DKK { get; set; }
    public double HUF { get; set; }
    public double CZK { get; set; }
    public double AUD { get; set; }
    public double RON { get; set; }
    public double SEK { get; set; }
    public double IDR { get; set; }
    public double INR { get; set; }
    public double BRL { get; set; }
    public double RUB { get; set; }
    public double HRK { get; set; }
    public double JPY { get; set; }
    public double THB { get; set; }
    public double CHF { get; set; }
    public double SGD { get; set; }
    public double PLN { get; set; }
    public double BGN { get; set; }
    public double TRY { get; set; }
    public double CNY { get; set; }
    public double NOK { get; set; }
    public double NZD { get; set; }
    public double ZAR { get; set; }
    public double USD { get; set; }
    public double MXN { get; set; }
    public double ILS { get; set; }
    public double GBP { get; set; }
    public double KRW { get; set; }
    public double MYR { get; set; }
}

public class Currency
{
    public Rates rates { get; set; }

}

Ваш метод действия должен быть следующим:

 public async Task<ActionResult> Index()
        {
            Currency CurencyInfo = new Currency();

            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(Baseurl);

                client.DefaultRequestHeaders.Clear();

                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                Uri myUri = new Uri("https://api.exchangeratesapi.io/latest", UriKind.Absolute);

                HttpResponseMessage Result = await client.GetAsync(myUri);

                if (Result.IsSuccessStatusCode)
                {
                    //Storing the response details recieved from web api   
                    var CurrencyResponse = Result.Content.ReadAsStringAsync().Result;


                    //Deserializing the response recieved from web api and storing into the CurrencyInfo 
                    CurencyInfo = JsonConvert.DeserializeObject<Currency>((JObject.Parse(CurrencyResponse)).ToString());

                }

                //returning the Currency Info to view  
                return View(CurencyInfo);
            }

        }

Примечание: Класс Rates содержит все свойства, возвращаемые API. Поэтому вы можете закомментировать любую валюту, данные которой вам не нужны. Я пробовал этот код, и он работает.

enter image description here

Вы можете использовать любой из онлайн-инструментов, таких как json2sharp, для создания классов / моделей для данных JSON, которые вы хотите десериализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...