天天看點

[Unity插件]LitJson雜談

關于和伺服器資料之間的轉換在此就不再贅述,官網以及一些部落格裡已有涉及,而且也比較詳細了。

這裡,主要談一下LitJson的其他用途。

想象一個場景,你需要顯示一個家庭資訊的表格,這個表格的每一行代表了你的一個家人的名字、年齡、手機号碼和住址等資訊。因為這個資訊不大,用資料庫實在是大材小用,而且也很麻煩。

我們可以用一個資料結構來在代碼裡表示每個家人的資訊:

public class FamilyInfo {  

    public string name;  

    public int age;  

    public string tellphone;  

    public string address;  

}  

然後用一個List來表示家庭資訊表:

public class FamilyList {  

    public List<FamilyInfo> family_list;  

最後,列印資訊:

private void DisplayFamilyList(FamilyList familyList) {  

    if (familyList == null) return;  

    foreach (FamilyInfo info in familyList.family_list) {  

        Debug.Log("Name:" + info.name + " Age:" + info.age + " Tel:" + info.tellphone + " Addr:" + info.address);  

    }  

準備工作都已經做好,那麼資料到底在什麼時候初始化呢?

一種方法是我們可以在編輯面闆裡直接初始化。為了達到目的,我們還需要告訴Unity編輯器在面闆裡顯示我們的FamilyInfo,以便我們可以随機編輯,這是通過在類名前聲明

[System.Serializable]來實作的。

具體代碼如下:

sing System.Collections;  

using System.Collections.Generic;  

using LitJson;  

[System.Serializable]  

public class LitJsonSample : MonoBehaviour {  

    public FamilyList m_FamilyList = null;  

    // Use this for initialization  

    void Start () {  

        DisplayFamilyList(m_FamilyList);  

    private void DisplayFamilyList(FamilyList familyList) {  

        if (familyList == null) return;  

        foreach (FamilyInfo info in familyList.family_list) {  

            Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  

        }  

    // Update is called once per frame  

    void Update () {  

運作結果如下:

[Unity插件]LitJson雜談

但是這種方法靈活性太差,而且很容易發生錯誤。例如當我們不小心改變了變量名稱,那麼我們在面闆裡編輯好的資料就都會不見了!下面介紹另一種比較好的方法——把資料儲存為本地的一個文本檔案。

正如前面所說,我們把資訊存成一個表格,并儲存為txt格式。注意,為了能使用LitJson解析,txt中必須使用Json格式。

family.txt如下:

{  

    "family_list": [  

        {  

            "name" : "candycat",  

            "age" : 21,  

            "tellphone" : "xxx",  

            "address" : "xxx"  

        },  

            "name" : "candycat#",  

            "age" : 22,  

            "name" : "candycat##",  

            "age" : 23,  

    ]  

代碼如下:

using UnityEngine;  

using UnityEditor;  

using System.Collections;  

        ReloadFamilyData();  

    private void ReloadFamilyData()  

    {             

        UnityEngine.TextAsset s = Resources.Load("Localize/family") as TextAsset;   

        string tmp = s.text;  

        m_FamilyList = JsonMapper.ToObject<FamilyList>( tmp );  

        if ( JsonMapper.HasInterpretError() )  

            Debug.LogWarning( JsonMapper.GetInterpretError() );  

有幾點注意的地方:

Resources.Load("Localize/family")表示加載family檔案,但一定要注意要把family.txt檔案放在Resources檔案夾下,隻有這樣Resources.Load才能夠通路到,在這個例子裡family的絕對路徑為“Resources/Localize/family”。這是因為Resources檔案夾是Unity預設的資源檔案夾,有着特殊的用途,這裡我還不是很了解,以後要深入學習一下;

Resources.Load參數中的路徑名一定不可以包含字尾,這裡也就是.txt字尾;

輸出結果和第一種方法完全一樣。

使用LitJson解析時,解析類(如上面的FamilyInfo)若包含Dictionary結構,則key的類型必須是string,而不能是int類型(如需表示id等),否則無法正确解析!

插件下載下傳位址:http://download.csdn.net/detail/candycat1992/6624695

本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366365,如需轉載請自行聯系原作者