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);
相关推荐
唐青枫9 小时前
内存为什么越来越高?C#.NET GC 详解:分代回收、LOH、终结器与性能优化实战
c#·.net
xiaohe0710 小时前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
yngsqq1 天前
平面图环 内轮廓
c#
rockey6271 天前
AScript之eval函数详解
c#·.net·script·eval·expression·动态脚本
He少年1 天前
【AI 辅助案例分享】
人工智能·c#·编辑器·ai编程
工程师0071 天前
栈和堆的概念
c#·栈和堆
不会编程的懒洋洋1 天前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
Avalon7121 天前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
njsgcs1 天前
solidworks折弯自动标注5 非90度折弯
c#·solidworks
狼与自由1 天前
clickhouse引擎
clickhouse·c#·linq