You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:20:51