WPF MVVM调用加密货币API时JSON反序列化为C#对象失败
问题诊断与解决
核心问题
API返回的JSON是数组格式(用[]包裹),但你试图直接反序列化为单个Crypto对象,这就是JsonException的直接原因。
解决方案步骤
1. 修正反序列化逻辑
把反序列化目标改为数组或集合类型,对应API返回的结构,再从中取第一个元素返回:
// 替换原反序列化代码 var cryptoList = await System.Text.Json.JsonSerializer.DeserializeAsync<List<Crypto>>(responseStream, new System.Text.Json.JsonSerializerOptions { IgnoreNullValues = true, PropertyNameCaseInsensitive = true }); return cryptoList?.FirstOrDefault();
2. 调整后的完整服务实现代码
public async Task<Crypto> GetCrypto(string symbol) { // 注意:HttpClient不应每次创建,建议复用(比如设为静态字段或依赖注入) using (HttpClient client = new HttpClient()) { // 后续记得替换为带symbol和密钥的动态URL using var response = await client.GetAsync("https://financialmodelingprep.com/api/v3/quote/BTCUSD?apikey=KEY", HttpCompletionOption.ResponseHeadersRead); response.EnsureSuccessStatusCode(); if (response.Content is object && response.Content.Headers.ContentType.MediaType == "application/json") { var responseStream = await response.Content.ReadAsStreamAsync(); try { var cryptoList = await System.Text.Json.JsonSerializer.DeserializeAsync<List<Crypto>>(responseStream, new System.Text.Json.JsonSerializerOptions { IgnoreNullValues = true, PropertyNameCaseInsensitive = true }); return cryptoList?.FirstOrDefault(); } catch (JsonException ex) { // 打印具体异常信息,方便调试 Console.WriteLine($"反序列化失败:{ex.Message}"); } } else { Console.WriteLine("HTTP响应无法反序列化为JSON"); } return null; } }
3. 主方法优化(可选)
尽量用async/await替代ContinueWith,代码更清晰易读:
async Task Main() { CryptoService cryptoService = new CryptoService(); var crypto = await cryptoService.GetCrypto("BTCUSD"); // 后续处理crypto对象 }
额外优化建议
- 复用HttpClient:每次创建HttpClient会耗尽套接字资源,建议将其设为单例或通过依赖注入管理。
- 动态构建URL:把symbol和API密钥参数化,替换硬编码的URL:
var url = $"https://financialmodelingprep.com/api/v3/quote/{symbol}?apikey=YOUR_API_KEY"; using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); - 增强异常日志:在catch块中打印完整异常堆栈,便于精准定位问题。
内容的提问来源于stack exchange,提问作者Hermes Çati
相关产品推荐
相关产品推荐

