使用JSON.NET反序列化JSON至Dictionary时返回null的问题
问题分析与解决方法
问题根源
你的JSON数据根节点本身就是一个键为交易代码、值为价格对象的字典结构,但你定义的Root类额外嵌套了一层Prices属性,导致JSON结构与类结构完全不匹配,反序列化时无法正确映射,最终出现priceRoot或priceRoot.Prices为null的情况,触发空引用异常。
解决方案
方案1:直接反序列化为字典(最简洁)
去掉不必要的Root类,直接将JSON反序列化为Dictionary<string, Price>:
- 简化类结构:
public class CurrentPriceClass { public class Price { public string price { get; set; } } }
- 修改反序列化代码:
Dictionary<string, CurrentPriceClass.Price> priceDict = JsonConvert.DeserializeObject<Dictionary<string, CurrentPriceClass.Price>>(dataJson); foreach (var kvp in priceDict) { Console.WriteLine($"{kvp.Key}: {kvp.Value.price}"); }
方案2:调整Root类以匹配JSON结构
如果必须保留Root类,可以通过以下两种方式适配JSON结构:
方式A:让Root继承字典
public class CurrentPriceClass { public class Root : Dictionary<string, Price> { } public class Price { public string price { get; set; } } }
反序列化代码不变,但遍历对象改为直接遍历priceRoot:
CurrentPriceClass.Root priceRoot = JsonConvert.DeserializeObject<CurrentPriceClass.Root>(dataJson); foreach (KeyValuePair<string, CurrentPriceClass.Price> price in priceRoot) { Console.WriteLine($"{price.Key}: {price.Value.price}"); }
方式B:使用JsonExtensionData特性
public class CurrentPriceClass { public class Root { [JsonExtensionData] public Dictionary<string, CurrentPriceClass.Price> Prices { get; set; } } public class Price { public string price { get; set; } } }
这种方式会自动将JSON根节点的所有键值对映射到Prices属性,原有的遍历代码可以正常使用。
内容的提问来源于stack exchange,提问作者AndrejStreicher
相关产品推荐
相关产品推荐

