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);
相关推荐
故事不长丨14 小时前
C#线程编程全解析:从基础应用到高级实践
c#·线程·多线程·thread·线程同步·异步编程·线程锁
xiaowu08020 小时前
C#调用 C++ DLL 加载地址方式选择
开发语言·c++·c#
码农学院1 天前
使用腾讯翻译文本
服务器·数据库·c#
十幺卜入1 天前
Unity3d C# 基于安卓真机调试日志抓取拓展包(Android Logcat)
android·c#·unity 安卓调试·unity 安卓模拟·unity排查问题
lingxiao168881 天前
WebApi详解+Unity注入--上篇:基于Framework的WebApi
c#·wpf·web
ttod_qzstudio1 天前
从Unity的C#到Babylon.js的typescript:“函数重载“变成“类型魔法“
typescript·c#·重载·babylon.js
eggcode1 天前
C#读写Bson格式的文件
c#·json·bson
爱说实话1 天前
C# 20260109
开发语言·c#