You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JSON.NET反序列化JSON至Dictionary时返回null的问题

问题分析与解决方法

问题根源

你的JSON数据根节点本身就是一个键为交易代码、值为价格对象的字典结构,但你定义的Root类额外嵌套了一层Prices属性,导致JSON结构与类结构完全不匹配,反序列化时无法正确映射,最终出现priceRoot或priceRoot.Prices为null的情况,触发空引用异常。

解决方案

方案1:直接反序列化为字典(最简洁)

去掉不必要的Root类,直接将JSON反序列化为Dictionary<string, Price>:

  1. 简化类结构:
public class CurrentPriceClass
{
    public class Price
    {
        public string price { get; set; }
    }
}
  1. 修改反序列化代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:15:38