我正在尝试将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中。为您的变量使用有意义的命名。对于实例而言,
webClient
比w
更有意义。变量名称写在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。