基於Json(鍵值對)配置文件的配置管理器


基於Json(鍵值對)配置文件的配置管理器

前言:在這個專題中,我們會講解UI框架項目。首先我們先來編寫基於鍵值對的的通用的配置管理器。在UI框架的項目中,我們會把我們一個一個的窗體都存為預設放在Resources目錄下。使用Resources.Load進行加載存儲在集合中。

一:Json文件的解析的Demo                                              

在講解配置管理器之前,我們先來說一下Json的解析,我們在這里使用Unity官方中的JsonUtility。

在官方的API中主要是這三個方法的使用,我們會一一的進行講解。首先我們先給出一個Json配置文件。

大家如果對Json了解的話,就會知道Json的格式:1.數據保存在鍵值對中,用逗號做分割。2.大括號保存對象,中括號保存數組。在上面我們看到,我們People對象中有我們需要的數據,存儲名稱和年齡信息,但是在People中有一個數組,說明這個對象中許多數據,數據都保存在鍵值對中,用逗號做分割來存儲一個又一個的數據。我們在這里一個類,來聲明一組信息,這個類需要被序列化【Serializable】,在這里需要注意的是,我們在People類聲明的Name和Age必須跟配置文件中的Name和Age相同。

 

namespace TestJson
{
    [Serializable]
    public class People
    {

        #region 字段和屬性定義

        public string Name;             //名稱
        public int Age;                 //年齡

        #endregion

        #region 公共方法的定義

        #endregion

        #region 私有方法的定義

        #endregion

    }//class_end
}

我們在需要聲明存放People類的多條數據,我們聲明一個集合(集合的字段People必須跟配置文件中的People相同):

namespace DemoProject
{
    [Serializable]
    public class PersonInfo
    {

        #region 字段和屬性定義

        public List<People> People = new List<People>();

        #endregion

        #region 公共方法的定義

        #endregion

        #region 私有方法的定義

        #endregion

    }//class_end
}

接下來需要對Resources目錄下的Json文件進行解析。

 

namespace DemoProject
{
    public class TestUnityJsonTwo : MonoBehaviour
    {

        #region 字段和屬性定義

        #endregion

        void Start()
        {
            //提取文件 得到字符串數據          
            TextAsset textAsset = Resources.Load<TextAsset>("Json\\People");
            //進行反序列化工作(文件-------->對象)
            PersonInfo personInfo = JsonUtility.FromJson<PersonInfo>(textAsset.text);
            //顯示對象數據
            foreach (People people in personInfo.People)
            {
                print(string.Format("Name:{0},Age:{1}", people.Name, people.Age));
            }
        }

        #region 公共方法的定義

        #endregion

        #region 私有方法的定義

        #endregion

    }//class_end
}

得到結果:

 

 二:Json解析在具體的項目中的應用                                                

首先先看一下我們在Project面板下的UI窗體預設的路徑。

我們會在Json配置文件中以鍵值對的形式把數據全部的保存下來。鍵:UI窗體的名稱,值:UI窗體的路徑信息。如下所示:

這樣做的目的是什么,主要是為了我們方便的管理。便於我們以后的維護。當我們開發完通用的配置管理器之后,當我們在以后的項目中在次遇到基於鍵值對Json文件時,就可以拿來使用了。

首先我們先來開發配置管理器接口。功能:基於“鍵值對”配置文件的通用的解析。我們在接口中聲明集合中的指定屬性和得到配置文件的最大的數量。

    interface IConfigManagerAble
    {

        Dictionary<string, string> AppSetting { get; }      //得到鍵值對集合數據
        int GetAppSettingMaxNumber();                       //得到配置文件的最大的數量

    }//class_end

我們還需要定義鍵值節點,這個類需要進行反序列化,如下所示:

    [Serializable]
    internal class KeyValueNode
    {
        public string Key = null;           //
        public string Value = null;         //
    }

我們還需要定義鍵值集合用來存儲所有的鍵值對的數據,我們可以使用List<KeyValueNode>集合類來進行存儲。

    [Serializable]
    internal class KeyValueInfo
    {
        public List<KeyValueNode> ConfigInfo = new List<KeyValueNode>();
    }

 

配置管理器接口全部的代碼實現如下:

namespace UIFromWork
{

    interface IConfigManagerAble
    {

        Dictionary<string, string> AppSetting { get; }      //得到鍵值對集合數據
        int GetAppSettingMaxNumber();                       //得到配置文件的最大的數量

    }//class_end

    [Serializable]
    internal class KeyValueInfo
    {
        public List<KeyValueNode> ConfigInfo = new List<KeyValueNode>();
    }

    [Serializable]
    internal class KeyValueNode
    {
        public string Key = null;           //
        public string Value = null;         //
    }

}

這時候需要定義接口的實現類,我們定義ConfigManagerByJson類繼承接口。我們在上面說到,我們需要把數據與鍵值對的形式存儲到集合中,我們很容易想到使用使用字段集合,因為接口中定義了集合的屬性為只屬性,我們也需要實現它:

        #region 字段和屬性定義

        /***
         *   保存"鍵值對"應用集合設置集合
         * */
        private readonly Dictionary<string, string> _appSetting = new Dictionary<string, string>();
        /***
         * 只讀屬性
         * */
        public Dictionary<string, string> AppSetting
        {
            get
            {
                return _appSetting;
            }
        }
        
        #endregion

我們在構造函數中進行初始化解析Json數據加載到集合中。我們需要json數據的路徑。所有參數是:UI窗體預設的路徑。我們先來寫一個私有的方法來進行初始化解析:

        /// <summary>
        /// 初始化解析Json數據加載到集合中
        /// </summary>
        /// <param name="jsonPath">Json數據路徑</param>
        private void InitAndAnalysisJson(string jsonPath)
        {
            KeyValueInfo keyValueInfo = null;

            //參數的檢查
            if (string.IsNullOrEmpty(jsonPath)) return;

            //解析Json配置文件
            try
            {
                //得到文件流數據
                TextAsset textAsset = Resources.Load<TextAsset>(jsonPath);
                //進行反序列化(數據------>對象)
                keyValueInfo = JsonUtility.FromJson<KeyValueInfo>(textAsset.text);
            }
            catch
            {
                //拋自定義異常
                throw new JsonAnlysisException(string.Format("{0}/InitAndAnalysisJson()/Json Analysis Exception !! Parameter : {1}", GetType(), jsonPath));
            }
            //數據加載到集合中
            foreach (KeyValueNode node in keyValueInfo.ConfigInfo)
            {
                _appSetting.Add(node.Key, node.Value);
            }
        }

 

這時候在構造函數中寫入方法即可:

        public ConfigManagerByJson(string jsonPath)
        {
            //初始化解析Json數據加載到集合中
            InitAndAnalysisJson(jsonPath);
        }

全部的實現代碼如下:

namespace UIFromWork
{
    public class ConfigManagerByJson : IConfigManagerAble
    {

        #region 字段和屬性定義

        /***
         *   保存"鍵值對"應用集合設置集合
         * */
        private readonly Dictionary<string, string> _appSetting = new Dictionary<string, string>();
        /***
         * 只讀屬性
         * */
        public Dictionary<string, string> AppSetting
        {
            get
            {
                return _appSetting;
            }
        }
        
        #endregion

        #region 構造函數的定義

        public ConfigManagerByJson(string jsonPath)
        {
            //初始化解析Json數據加載到集合中
            InitAndAnalysisJson(jsonPath);
        }

        #endregion

        #region 公共方法的定義

        /// <summary>
        /// 得到集合中的最大的數量
        /// </summary>
        /// <returns></returns>
        public int GetAppSettingMaxNumber()
        {
            if (_appSetting != null && _appSetting.Count >= 1)
            {
                return _appSetting.Count;
            }
            else
            {
                return 0;
            }
        }

        #endregion

        #region 私有方法的定義

        /// <summary>
        /// 初始化解析Json數據加載到集合中
        /// </summary>
        /// <param name="jsonPath">Json數據路徑</param>
        private void InitAndAnalysisJson(string jsonPath)
        {
            KeyValueInfo keyValueInfo = null;

            //參數的檢查
            if (string.IsNullOrEmpty(jsonPath)) return;

            //解析Json配置文件
            try
            {
                //得到文件流數據
                TextAsset textAsset = Resources.Load<TextAsset>(jsonPath);
                //進行反序列化(數據------>對象)
                keyValueInfo = JsonUtility.FromJson<KeyValueInfo>(textAsset.text);
            }
            catch
            {
                //拋自定義異常
                throw new JsonAnlysisException(string.Format("{0}/InitAndAnalysisJson()/Json Analysis Exception !! Parameter : {1}", GetType(), jsonPath));
            }
            //數據加載到集合中
            foreach (KeyValueNode node in keyValueInfo.ConfigInfo)
            {
                _appSetting.Add(node.Key, node.Value);
            }
        }

        #endregion

    }//class_end
}
View Code

這時候我們就可以在客戶端進行調用了,我們先聲明一個集合:

private Dictionary<string, string> _dicFormPaths = new Dictionary<string, string>();                                //UI窗體預設的路徑(1.窗體預設名稱 2.窗體預設路徑)

我們把路徑數據全部存儲到集合中,這時候可以使用文件配置管理器的腳本,代碼如下:

        /// <summary>
        /// 初始化"UI窗體預設"路徑數據
        /// </summary>
        private void InitUiFormPathData()
        {
            IConfigManagerAble configManager = new ConfigManagerByJson(“路徑信息”);
            if (configManager != null)
            {
                _dicFormPaths = configManager.AppSetting;
            }
        }

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM