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);
相关推荐
FuckPatience15 小时前
C# 对象初始化器对属性赋值vs构造函数里对属性赋值
c#
m0_7482331717 小时前
C语言vsC#:核心差异全解析
c语言·开发语言·c#
MyBFuture17 小时前
C# 关于联合编程基础
开发语言·c#·visual studio·vision pro
Sunsets_Red17 小时前
单调队列优化dp
c语言·c++·算法·c#·信息学竞赛
故事不长丨17 小时前
《C#委托与事件深度解析:区别、联系与实战应用》
开发语言·c#·委托·事件·event
程序猿小玉兒18 小时前
解决大文件上传失败问题
c#·.net
code_li19 小时前
语音播报功能 C# net4.5代码
c#·语音播报
虫小宝19 小时前
淘客返利系统的日志追踪与链路监控:SkyWalking 与 OpenTelemetry 集成方案
c#·linq·skywalking
小金子会发光19 小时前
【工业相机实战】基于 C# WinForms 的映美精(ic4)相机采集与显示全流程实现
计算机视觉·c#·视觉检测·visual studio
老骥伏枥~19 小时前
C# 数据类型:值类型与引用类型
c#