C#用Newtonsoft.Json反序列化滑块值触发InvalidCastException错误如何解决
报错问题修复方案
错误根源
- 反序列化未指定类型:
JsonConvert.DeserializeObject(stuffString)无泛型参数时返回的是object类型的Settings实例,无法直接强转为double - 数据类型不匹配:你存储的是完整的
Settings类对象,并非直接存储滑块的double数值,且Settings中的SongVolume定义为字符串类型,和滑块Value的double类型不匹配
最优修复方案
直接调整Settings类的属性类型为double,避免不必要的类型转换,同时修改读写逻辑:
1. 修改Data.Settings类
public class Settings { [JsonProperty("songVolume")] public double SongVolume { get; set; } }
2. 修改SaveSettings方法
public void SaveSettings() { var settings = new Data.Settings { SongVolume = VolumeSlider.Value }; var stuffString = JsonConvert.SerializeObject(settings); // 新增目录存在性判断,避免目录不存在时报写入失败错误 if (!Directory.Exists(@".\utils")) { Directory.CreateDirectory(@".\utils"); } File.WriteAllText(@".\utils\Settings.json", stuffString); }
3. 修改LoadSettings方法
public void LoadSettings() { if (!File.Exists(@".\utils\Settings.json")) { return; } var stuffString = File.ReadAllText(@".\utils\Settings.json"); // 明确指定反序列化目标类型为Data.Settings var settings = JsonConvert.DeserializeObject<Data.Settings>(stuffString); if (settings != null) { VolumeSlider.Value = settings.SongVolume; } }
兼容方案(必须保留SongVolume为字符串的场景)
如果业务要求必须将SongVolume存为字符串,只需要调整Load阶段的类型转换逻辑即可:
public void LoadSettings() { if (!File.Exists(@".\utils\Settings.json")) { return; } var stuffString = File.ReadAllText(@".\utils\Settings.json"); var settings = JsonConvert.DeserializeObject<Data.Settings>(stuffString); if (settings != null && double.TryParse(settings.SongVolume, out double volumeVal)) { VolumeSlider.Value = volumeVal; } }
内容的提问来源于stack exchange,提问作者Gloozzy
相关产品推荐
相关产品推荐

