JSON转C#类反序列化失败,需用嵌套字典及NewtonSoft实现
解决方案:Newtonsoft.Json 嵌套字典反序列化实现
1. 定义匹配的根对象类
直接把rates字段声明为嵌套字典类型,同时处理JSON里可能和C#关键字冲突的字段(比如base):
public class ExchangeRateResult { // 按需添加JSON里的其他字段,比如base、start_date等 public string @base { get; set; } public string start_date { get; set; } public string end_date { get; set; } // 核心:日期为键,每个日期对应货币-汇率的字典 public Dictionary<string, Dictionary<string, double>> rates { get; set; } }
如果你的C#字段名和JSON键名大小写不一致(比如C#用Rates而JSON是rates),给字段加JsonProperty特性指定映射:
[JsonProperty("rates")] public Dictionary<string, Dictionary<string, double>> Rates { get; set; }
2. 执行反序列化
一行代码直接解析:
var jsonContent = "你的JSON字符串内容"; var rateData = JsonConvert.DeserializeObject<ExchangeRateResult>(jsonContent);
3. 排查反序列化失败的常见坑
如果还是跑不通,检查这几个点:
- JSON格式合法性:先确认JSON没有语法错误(比如多余逗号、未闭合引号),用本地的JSON编辑器(比如VS自带的)校验。
- 汇率值类型不匹配:如果JSON里的汇率是字符串(比如
"1.23")而非数字,要么把字典值类型改成string,要么写个自定义转换器转成double。 - 空值或缺失字段:如果某些日期下的货币字段是
null,把double改成double?(可空类型)避免报错。 - 嵌套层级错误:确认JSON里的
rates确实是「日期→货币→汇率」的两层结构,没有多嵌套或少嵌套。
测试示例
假设你的JSON结构如下,用上面的代码可以直接解析成功:
{ "base": "USD", "start_date": "2024-05-01", "end_date": "2024-05-03", "rates": { "2024-05-01": { "AUD": 1.5287, "EUR": 0.9165, "GBP": 0.7821 }, "2024-05-02": { "AUD": 1.5292, "EUR": 0.9159, "USD": 1.0 } } }
内容的提问来源于stack exchange,提问作者chris crowe
相关产品推荐
相关产品推荐

