如何在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); }
关键改动说明
- 将原代码中直接强制转换JObject的行,改为先获取JArray:
var cryptoCurrencyArray = (JArray)data[coinSymbol]; - 添加空值与空数组检查,避免因API返回异常数据导致崩溃
- 通过
cryptoCurrencyArray.First提取数组中的第一个(也是唯一的)币种对象,转为JObject后继续后续解析
内容的提问来源于stack exchange,提问作者Dolotboy
相关产品推荐
相关产品推荐

