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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:57:01