如何在C#中正确解析CoinGecko API返回的JSON数据?
解决CoinGecko API JSON反序列化后USD值为0的问题
问题重现的JSON数据
{"0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0": {"usd": 0.889768}}
核心问题分析
你遇到的USD值为0的情况,大概率是模型定义不匹配导致的:
- 要么未正确映射JSON中的
usd字段(比如大小写不匹配且未配置JsonProperty特性); - 要么反序列化时使用的类型不正确,没有对应到字典嵌套对象的结构。
正确的模型定义与反序列化代码
1. 定义匹配的实体类
public class TokenPrice { // 用JsonProperty特性绑定JSON中的小写"usd"字段 [JsonProperty("usd")] public decimal UsdPrice { get; set; } }
2. 反序列化为字典类型
因为JSON顶层是合约地址作为键、价格对象作为值的结构,直接反序列化为Dictionary<string, TokenPrice>即可:
string coinGeckoJson = "{\"0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0\": {\"usd\": 0.889768}}"; // 使用JsonConvert执行反序列化 var priceMap = JsonConvert.DeserializeObject<Dictionary<string, TokenPrice>>(coinGeckoJson); // 读取目标合约的USD价格 if (priceMap.TryGetValue("0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", out var priceData)) { // 输出结果:0.889768 Console.WriteLine($"USD价格:{priceData.UsdPrice}"); }
常见错误排查
- 如果模型类中没有
[JsonProperty("usd")]特性,且属性名是大写的Usd,JsonConvert会因大小写不匹配无法绑定值,最终返回decimal的默认值0; - 避免用
dynamic类型直接读取,类型推导可能导致小数精度丢失或绑定失败; - 无需额外配置JsonConvert的小数处理规则,默认配置即可正确解析JSON中的小数为decimal类型。
内容的提问来源于stack exchange,提问作者Xskode Media
相关产品推荐
相关产品推荐

