C#中JSON解析问题:解析Alpha Vantage API返回JSON遇困难
解决Alpha Vantage JSON解析问题
嘿,我来帮你搞定这个Alpha Vantage返回的JSON解析难题!首先咱们先看看这个JSON的结构特点:它的顶层是一个名为"Realtime Currency Exchange Rate"的对象,里面的字段键都是带序号、空格和点的特殊格式,这也是你用dynamic可能踩坑的原因——C#里没法直接用点语法访问带空格的属性名。
下面给你两种可行的解决方案:
方案一:用Dynamic结合索引器访问
如果你想继续用dynamic,那得通过索引器来访问那些特殊命名的字段,而不是直接用点语法。代码示例如下:
using System; using System.Net; using Newtonsoft.Json; class Program { static void Main(string[] args) { string link = "你的Alpha Vantage API链接"; using (var wc = new WebClient()) { string json = wc.DownloadString(link); dynamic exchangeData = JsonConvert.DeserializeObject(json); // 先获取顶层的实时汇率对象 var realtimeRate = exchangeData["Realtime Currency Exchange Rate"]; // 用索引器访问各个字段,注意键名要完全匹配 string fromCode = realtimeRate["1. From_Currency Code"]; string fromName = realtimeRate["2. From_Currency Name"]; string toCode = realtimeRate["3. To_Currency Code"]; string toName = realtimeRate["4. To_Currency Name"]; decimal exchangeRate = decimal.Parse(realtimeRate["5. Exchange Rate"]); DateTime lastRefreshed = DateTime.Parse(realtimeRate["6. Last Refreshed"]); string timeZone = realtimeRate["7. Time Zone"]; // 测试输出 Console.WriteLine($"{fromName}({fromCode}) → {toName}({toCode})"); Console.WriteLine($"汇率: {exchangeRate}"); Console.WriteLine("最后更新时间: {0} ({1})", lastRefreshed, timeZone); } } }
方案二:强类型解析(更推荐)
如果想要更健壮、更易维护的代码,强类型解析是更好的选择。你可以定义和JSON结构对应的实体类,通过JsonProperty特性映射那些特殊的键名,这样就能享受编译时类型检查,避免拼写错误导致的运行时问题。
首先定义实体类:
using Newtonsoft.Json; using System; public class RealtimeCurrencyExchangeRate { [JsonProperty("1. From_Currency Code")] public string FromCurrencyCode { get; set; } [JsonProperty("2. From_Currency Name")] public string FromCurrencyName { get; set; } [JsonProperty("3. To_Currency Code")] public string ToCurrencyCode { get; set; } [JsonProperty("4. To_Currency Name")] public string ToCurrencyName { get; set; } [JsonProperty("5. Exchange Rate")] public decimal ExchangeRate { get; set; } [JsonProperty("6. Last Refreshed")] public DateTime LastRefreshed { get; set; } [JsonProperty("7. Time Zone")] public string TimeZone { get; set; } } public class AlphaVantageCurrencyResponse { [JsonProperty("Realtime Currency Exchange Rate")] public RealtimeCurrencyExchangeRate RealtimeCurrencyExchangeRate { get; set; } }
然后用强类型来解析JSON:
using System; using System.Net; using Newtonsoft.Json; class Program { static void Main(string[] args) { string link = "你的Alpha Vantage API链接"; using (var wc = new WebClient()) { string json = wc.DownloadString(link); var response = JsonConvert.DeserializeObject<AlphaVantageCurrencyResponse>(json); var rateData = response.RealtimeCurrencyExchangeRate; if (rateData != null) { Console.WriteLine($"{rateData.FromCurrencyName}({rateData.FromCurrencyCode}) → {rateData.ToCurrencyName}({rateData.ToCurrencyCode})"); Console.WriteLine($"汇率: {rateData.ExchangeRate}"); Console.WriteLine("最后更新时间: {0} ({1})", rateData.LastRefreshed, rateData.TimeZone); } } } }
注意:两种方案都需要你安装Newtonsoft.Json(也就是Json.NET)NuGet包,如果你还没装的话,在NuGet包管理器里搜索安装即可。
内容的提问来源于stack exchange,提问作者Bautistf
相关产品推荐
相关产品推荐

