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

如何在C#中用NewtonSoft读取嵌套JSON属性(CoinMarketCap API场景)

解决CoinMarketCap API的JArray转JObject类型错误问题

问题原因

你触发的System.InvalidCastException是因为CoinMarketCap v2 API的返回结构中,data[coinSymbol]是JArray数组类型,而非你预期的JObject——哪怕仅查询单个币种,API也会用数组包裹唯一的币种对象。

解决方案

先将data[coinSymbol]转为JArray,再提取数组的第一个元素(单个币种场景下唯一的元素),之后再转为JObject继续解析价格数据。

修正后的完整代码

public static string GetCryptoUnitValue(string coinSymbol)
{
    var URL = new UriBuilder("https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest");

    var queryString = HttpUtility.ParseQueryString(string.Empty);
    queryString["symbol"] = coinSymbol;
    queryString["convert"] = "USD";

    URL.Query = queryString.ToString();

    var client = new WebClient();
    client.Headers.Add("X-CMC_PRO_API_KEY", API_KEY);
    client.Headers.Add("Accepts", "application/json");

    string cryptoData = client.DownloadString(URL.ToString());

    JObject json = JObject.Parse(cryptoData);
    var data = (JObject)json["data"];
    
    // 关键修正:先转为JArray,再取第一个元素
    var cryptoCurrencyArray = (JArray)data[coinSymbol];
    if (cryptoCurrencyArray == null || !cryptoCurrencyArray.Any())
    {
        throw new ArgumentException($"未找到币种 {coinSymbol} 的数据");
    }
    var cryptoCurrency = (JObject)cryptoCurrencyArray.First;
    
    var quote = cryptoCurrency["quote"];
    var usd = (JObject)quote["USD"];
    var price = (double)usd["price"];
    MessageBox.Show(Convert.ToString(price));

    return Convert.ToString(price);
}

关键改动说明

  1. 将原代码中直接强制转换JObject的行,改为先获取JArray:var cryptoCurrencyArray = (JArray)data[coinSymbol];
  2. 添加空值与空数组检查,避免因API返回异常数据导致崩溃
  3. 通过cryptoCurrencyArray.First提取数组中的第一个(也是唯一的)币种对象,转为JObject后继续后续解析

内容的提问来源于stack exchange,提问作者Dolotboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:57:06