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);
相关推荐
步步为营DotNet15 分钟前
.NET 可观测性选型:Metrics、ActivitySource、EventSource 到底该用哪个
c#·.net·metrics·可观测性
吃一碗粉只付一碗钱12 小时前
16-SqlSugar多库ConfigId与按实体选连接
sqlserver·c#
rockey62713 小时前
AScript之字符串模板
c#·.net·script·expression·动态脚本
will_net14 小时前
Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis
redis·c#·bootstrap
BuHuaX21 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
asdzx6721 小时前
C# 操作 PDF 元数据:从属性写入到字段提取的完整流程
前端·pdf·c#
氷凌公子1 天前
算法与UI拆分中遇到的问题及解决方式
c#·onnx·yolov26
1-1=01 天前
C# 泛型
c#·.net·.netcore
椒颜皮皮虾྅2 天前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda