JsonHelper使用

一,定义配置文件类

csharp 复制代码
 public class SettingsDefine
 {
 
     public static SystemSettingClass SystemSetting = new SystemSettingClass();
     public static DispensingCfgClass DispensingCfg = new DispensingCfgClass();

     public class SystemSettingClass : JsonHelper
     { 
         public string PortName = "COM1";
         public string BaudRate = "9600";
     }
     public class DispensingCfgClass : JsonHelper
     {
         public string DisMode;
         public string Preset;
     }

     private static string  Path = Application.StartupPath.Replace("\\FSTW_New\\bin\\Debug", "") + "\\config";

     public static void ReadParams()
     {
             SystemSetting.ReaderParams(Path, "SystemSetting", ref SystemSetting);
             if (SystemSetting == null)
             {
                 SystemSetting = new SystemSettingClass();
                 SystemSetting.ReadBufferDate(Path, "SystemSetting", ref SystemSetting);
             }
             SystemSetting.SetSaveFile(Path, "SystemSetting", SystemSetting);

             DispensingCfg.ReaderParams(Path, "DispensingCfg", ref DispensingCfg);
             if (DispensingCfg == null)
             {
                 DispensingCfg = new DispensingCfgClass();
                 DispensingCfg.ReadBufferDate(Path, "DispensingCfg", ref DispensingCfg);
             }
             DispensingCfg.SetSaveFile(Path, "DispensingCfg", DispensingCfg);
     }
 }

二,JsonHelper

csharp 复制代码
public class JsonHelper
{
    private object locker = new object();
    /// <summary>
    /// 写入文件
    /// </summary>
    /// <param name="path"></param>
    /// <param name="o"></param>
    protected void ObjectToJsonFile(string path, object o)
    {
        try
        {
            string str = JsonConvert.SerializeObject(o);
            File.WriteAllText(path, str); 
        }
        catch (Exception ex)
        {
            MessageBox.Show($"写入配置文件失败!路径:{path}-信息{ex.Message}");
        }
    }

    /// <summary>
    /// 反序列化,文件转对象
    /// </summary>
    /// <param name="path"></param>
    /// <param name="o"></param>
    /// <returns></returns>
    protected object JsonFileToObject(string path, object o)
    {
        string str = string.Empty;
        object ret = null;
        try
        {
            str = File.ReadAllText(path);
            ret = JsonConvert.DeserializeObject(str, o.GetType());
        }
        catch (Exception ex)
        {
            MessageBox.Show($"读取配置文件失败!路径: {path}-信息:{ex.Message}");
            return null;
            
        }
        return ret;
    }

    [JsonIgnore]
    private string strsaveFile { get; set;}
    [JsonIgnore]
    private string strsaveFile1 {get; set;}
    /// <summary>
    /// 1.反序列化对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strBaseDic"></param>
    /// <param name="fileName"></param>
    /// <param name="objectTemp"></param>
    public bool ReaderParams<T>(string strBaseDic, string fileName, ref T objectTemp)
    {
        #region
        bool isResult = true;
        try
        {
            if (!Directory.Exists(strBaseDic))
            {
                Directory.CreateDirectory(strBaseDic);
            }
            if (File.Exists(strBaseDic + "\\" + fileName + ".json"))
            {
                objectTemp = (T)JsonFileToObject(strBaseDic + "\\" + fileName + ".json", objectTemp);
            }
            else
            {
                ObjectToJsonFile(strBaseDic + "\\" + fileName + ".json", objectTemp);
                isResult = false;
            }
        }
        catch (Exception ex)
        {
            isResult = false;
            //default 会返回指定类型的默认值
            //引用类型(如类、接口、数组等)→ null
            //值类型(如 int、double、bool 等)→ 0 或 false 等
            //结构体 → 将所有字段设为其默认值的实例
            objectTemp = default;
            MessageBox.Show($"ReaderParams失败-路径:{strBaseDic + "\\" + fileName + ".json"}信息{ex.Message}");
        }
        return isResult;
        #endregion
    }


    /// <summary>
    /// 如果文件数据异常,则加载备用参数
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strBaseDic"></param>
    /// <param name="fileName"></param>
    /// <param name="objectTemp"></param>
    public void ReadBufferDate<T>(string strBaseDic, string fileName, ref T objectTemp)
    {

        DialogResult dlgResult = MessageBox.Show(strBaseDic + "\\" + fileName + ".json" + " 该文件数据存在异常,是否加载备用参数", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dlgResult == DialogResult.Yes)
        {
            objectTemp = (T)JsonFileToObject(strBaseDic + "开机备份\\" + fileName + ".json", objectTemp);
            ObjectToJsonFile(strBaseDic + "\\" + fileName + ".json", objectTemp);
        }
        else
        {
            Environment.Exit(1);
            Process.GetCurrentProcess().Kill();
        }

    }

    /// <summary>
    /// 3.设置文件路径,写入开机备份文件
    /// </summary>
    /// <param name="strBaseDic"></param>
    /// <param name="fileName"></param>
    public void SetSaveFile<T>(string strBaseDic, string fileName, T objectTemp)
    {
        strsaveFile = strBaseDic + "\\" + fileName + ".json";
        strsaveFile1 = strBaseDic + "开机备份\\" + fileName + ".json";

        if (!Directory.Exists(strBaseDic + "开机备份"))
        {
            Directory.CreateDirectory(strBaseDic + "开机备份");
        }
        ObjectToJsonFile(strBaseDic + "开机备份\\" + fileName + ".json", objectTemp);
    }


    /// <summary>
    /// 写入配置文件 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="objectTemp"></param>
    public virtual void WriteParams<T>(T objectTemp)
    {
        lock (locker)
        {
            ObjectToJsonFile(strsaveFile, objectTemp);
        }
    }
    /// <summary>
    /// 将Json字符串转换成类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="jsonstr"></param>
    /// <param name="obj"></param>
    /// <returns></returns>
    public bool JsonStrToObject<T>(string jsonstr, ref T obj)
    {
        bool result = false;
        try
        {
            obj = (T)JsonConvert.DeserializeObject(jsonstr, obj.GetType());
            result = true;
        }
        catch
        {
            result = false;
        }
        return result;
    }
}

三,使用方法

1.在主入口调用读取配置文件

csharp 复制代码
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    SettingsDefine.ReadParams();//读取配置文件,生成对象
    Application.Run(new FormMain());
}

2.保存配置文件

csharp 复制代码
SettingsDefine.DispensingCfg.WriteParams(SettingsDefine.DispensingCfg);
SettingsDefine.SystemSetting.WriteParams(SettingsDefine.SystemSetting);
相关推荐
FL16238631292 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
love530love4 小时前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
bcbobo21cn5 小时前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
月巴月巴白勺合鸟月半7 小时前
一次PDF文件的处理(一)
pdf·c#
大鹏说大话8 小时前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#
武藤一雄10 小时前
WPF处理耗时操作的7种方法
microsoft·c#·.net·wpf
武藤一雄11 小时前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
l1t12 小时前
DeepSeek总结的用 C# 构建 DuckDB 插件说明
前端·数据库·c#·插件·duckdb
iReachers13 小时前
恒盾C#混淆加密大师 1.4.5 最新2026版本发布 (附CSDN下载地址)
c#·c#混淆·c#加密·wpf加密·winform加密
历程里程碑14 小时前
43. TCP -2实现英文查中文功能
java·linux·开发语言·c++·udp·c#·排序算法