C#反序列化API响应时coversio_rates字段始终为null如何解决?
问题原因
核心原因是JSON响应中的键名与C#模型属性名不匹配:
你调用的API返回的汇率字段键名为小写蛇形格式的coversio_rates,而你定义的Info类中对应的属性名是首字母大写的Coversio_Rates。你使用的Newtonsoft.Json库默认执行大小写敏感的名称匹配,名称不匹配的字段会跳过赋值,其余字段因为属性名和JSON键名完全一致所以可以正常赋值。
解决方案
以下三种方案任选其一即可:
方案1:修改属性名匹配JSON键名
直接将Info类中的汇率属性名改为和API返回完全一致的格式:public class Info { public string result { get; set; } public string documetatio { get; set; } public string base_code { get; set; } // 修改属性名和JSON键名完全匹配 public Coversio_Rates coversio_rates { get; set; } }方案2:使用JsonProperty特性指定映射关系(更推荐)
不需要修改原有属性名,通过特性显式指定反序列化时对应的JSON键名,符合C#大驼峰命名规范:public class Info { public string result { get; set; } public string documetatio { get; set; } public string base_code { get; set; } [JsonProperty("coversio_rates")] public Coversio_Rates Coversio_Rates { get; set; } }方案3:全局配置蛇形命名策略(适配同规则的整个接口项目)
如果你对接的整个项目的API返回都是小写蛇形命名格式,可以全局配置反序列化规则,不需要单独给每个属性加特性:string response = await apiResponse.Content.ReadAsStringAsync(); var typetoReturn = JsonConvert.DeserializeObject<Info>(response, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeCaseNamingStrategy() } });
额外优化建议
- 你当前使用
.Result同步等待异步方法返回,高并发场景下有死锁风险,建议改为await异步读取响应内容 - 汇率类的属性建议用
decimal类型替代float,避免浮点精度丢失问题
内容的提问来源于stack exchange,提问作者Adex
相关产品推荐
相关产品推荐

