我正在尝试将JSON数据转换为C#类的对象,并将值显示到控制台程序中。每次运行它时,控制台窗口都会变成空白,我相信问题出在CurrencyRates类内,但是对此我还是陌生的,不确定。任何帮助,将不胜感激!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;



namespace Cooper_Lab12
{
    class Program
    {
        static void Main(string[] args)
        {


            var currencyRates = _download_serialized_json_data<CurrencyRates>("https://openexchangerates.org/api/latest.json?app_id=4be3cf28d6954df2b87bf1bb7c2ba47b");

            Console.Read();
        }


        private static T _download_serialized_json_data<T>(string url) where T : new()
        {


            //var currencyRates = _download_serialized_json_data<CurrencyRates>(url);
            using (var w = new WebClient())
            {

                var json_data = string.Empty;
                // attempt to download JSON data as a string
                try
                {
                    json_data = w.DownloadString("https://openexchangerates.org/api/latest.json?app_id=4be3cf28d6954df2b87bf1bb7c2ba47b ");
                }
                catch (Exception) { }
                // if string with JSON data is not empty, deserialize it to class and return its instance
                return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T();
            }


        }
        public class RootObject
        {
            public string Disclaimer { get; set; }
            public string License { get; set; }
            public int Timestamp { get; set; }
            public string Base { get; set; }
            public Dictionary<string, decimal> Rates { get; set; }
        }

    }
}


这是我的CurrencyRates类:

public class CurrencyRates
{
    public string Disclaimer { get; set; }
    public string License { get; set; }
    public int TimeStamp { get; set; }
    public string Base { get; set; }
    public Dictionary<string, decimal> Rates { get; set; }
}

最佳答案

您的代码有效。但是,您不要尝试将结果输出到控制台。这就是为什么您什么都看不到的原因。

如果将以下内容添加到Main之后的currencyRates方法中,则将看到已检索的值。

Console.WriteLine($"{currencyRates.Disclaimer}");
Console.WriteLine($"{currencyRates.License}");
Console.WriteLine($"{currencyRates.TimeStamp}");
Console.WriteLine($"{currencyRates.Base}");
foreach (var currencyRatesRate in currencyRates.Rates)
{
    Console.WriteLine($"Key: {currencyRatesRate.Key}, Value: {currencyRatesRate.Value}");
}


笔记

通常,最好遵循标准的命名约定,以使代码的读者可以快速了解正在发生的事情。例如,所有方法名称都写在Pascal Case中。为您的变量使用有意义的命名。对于实例而言,webClientw更有意义。变量名称写在Camel Case中。例如,json_data应该在jsonData中重命名。避免在代码中包含许多空行。对于您的代码阅读者来说,专注于几行内容并阅读您的代码会容易得多。最后但并非最不重要的一点是,您为字符串类型的方法声明了一个参数,并且从未使用过它。应该使用此参数代替DownloadString方法中的硬编码字符串。

您现在可以将重构的方法与我们最初使用的方法进行比较:

private static T DownloadAndDeserializeJsonData<T>(string url) where T : new()
{
    using (var webClient = new WebClient())
    {
        var jsonData = string.Empty;
        try
        {
            jsonData = webClient.DownloadString(url);
        }
        catch (Exception) { }
        return !string.IsNullOrEmpty(jsonData)
                   ? JsonConvert.DeserializeObject<T>(jsonData)
                   : new T();
    }
}


如果您想在有关.NET Framework和C#的命名准则中占据中心位置,可以查看enter link description here

10-07 17:45