基於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 }
這時候我們就可以在客戶端進行調用了,我們先聲明一個集合:
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; } }