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

C#反序列化含多对象的JSON文件报错,求问题原因及解决

JSON反序列化错误的原因及修复方案

问题根源

  1. JSON结构与目标类型不匹配
    你的JSON根节点是一个包含Server数组的对象,而非直接的数组。但你尝试直接将整个JSON反序列化为List<Values>,这不符合JSON的层级结构,导致序列化器报错。

  2. 数据类型不匹配
    JSON中的温度字段(AvgTemp、CurTemp等)是数值类型(整数或浮点数),但你的Values类中对应属性定义为string类型,会导致类型转换失败。

  3. 属性访问权限问题
    Values类中的Name属性是私有(默认private),JSON序列化器无法读取或写入该属性,会导致数据无法正确映射。

修复步骤

1. 创建根类匹配JSON结构

新增一个根类来对应JSON的最外层对象:

public class ServerRoot
{
    public List<Values> Server { get; set; }
}

2. 修正Values类的属性类型与访问权限

将温度属性改为对应数值类型,同时把Name设为public:

public class Values : INotifyPropertyChanged
{
    public Values()
    {
            
    }

    // 改为public,允许序列化器访问
    public string Name { get; set; }

    // AvgTemp是整数,用int类型
    int avgTemp; 
    public int AvgTemp { get => avgTemp; set
        {
            if(avgTemp != value)
            {
                avgTemp = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AvgTemp)));
            }
        }
    }

    // MaxTemp是整数,用int类型
    int maxTemp; 
    public int MaxTemp { get => maxTemp; set
        {
            if(maxTemp != value)
            {
                maxTemp = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MaxTemp)));
            }
        }
    }

    // MinTemp兼容整数和浮点数,用double类型
    double minTemp; 
    public double MinTemp
    {
        get => minTemp; set
        {
            if (minTemp != value)
            {
                minTemp = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MinTemp)));
            }
        }
    }

    // CurTemp是浮点数,用double类型
    double curTemp;
    public double CurTemp
    {
        get => curTemp; set
        {
            if (curTemp != value)
            {
                curTemp = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurTemp)));   
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

3. 修改反序列化代码

现在可以正确反序列化为根类,再取出Server数组:

public void ReadJson() // 补充方法返回值,原代码缺少返回类型
{
    using (var file = new FileStream("E:\\Programming\\Timmermann00\\Betrieblicher_Auftrag\\JSON\\Values.json", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (StreamReader r = new StreamReader(file))
    {
        string json = r.ReadToEnd();
        // 反序列化为根类
        ServerRoot root = JsonConvert.DeserializeObject<ServerRoot>(json); 
        // 取出服务器列表
        List<Values> values = root.Server;
        // 后续可正常使用values数据
    }
}

内容的提问来源于stack exchange,提问作者Tim Harbeck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:31