C#反序列化含多对象的JSON文件报错,求问题原因及解决
JSON反序列化错误的原因及修复方案
问题根源
JSON结构与目标类型不匹配
你的JSON根节点是一个包含Server数组的对象,而非直接的数组。但你尝试直接将整个JSON反序列化为List<Values>,这不符合JSON的层级结构,导致序列化器报错。数据类型不匹配
JSON中的温度字段(AvgTemp、CurTemp等)是数值类型(整数或浮点数),但你的Values类中对应属性定义为string类型,会导致类型转换失败。属性访问权限问题
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
相关产品推荐
相关产品推荐

