【转载】【Unity插件】LitJson杂谈

    xiaoxiao2025-10-06  3

    原文地址:http://blog.csdn.net/candycat1992/article/details/10940245

    距离上一次更新博客已有一段时间了,一实习就懒了,嘿嘿。这次谈一下在实习里新碰到的一个Unity插件——LitJson(也可以去官网下载最新版)。

    版权声明:本文为博主原创文章,未经博主允许不得转载。[因为博主不允许转载,博主看到请原谅我,主要是你写的太好了]

    开场白

    LitJson是一个开源项目,比较小巧轻便,安装也很简单,在Unity里只需要把LitJson.dll放到Plugins文件夹下,并在代码的最开头添加 “Using LitJson”就可以了。简单来说,LitJson的用途是实现Json和代码数据之间的转换,一般用于从服务器请求数据,得到返回的Json后进行转换从而在代码里可以访问。具体请详见LitJson的官网。

    关于和服务器数据之间的转换在此就不再赘述,官网以及一些博客里已有涉及,而且也比较详细了。

    这里,主要谈一下LitJson的其他用途。

    想象一个场景,你需要显示一个家庭信息的表格,这个表格的每一行代表了你的一个家人的名字、年龄、手机号码和住址等信息。因为这个信息不大,用数据库实在是大材小用,而且也很麻烦。

    我们可以用一个数据结构来在代码里表示每个家人的信息:

    [csharp] view plain copy print ? public class FamilyInfo {       public string name;       public int age;       public string tellphone;       public string address;  }   然后用一个List来表示家庭信息表: [csharp] view plain copy print ? public class FamilyList {       public List family_list;  }   最后,打印信息: [csharp] view plain copy print ? 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]来实现的。

    具体代码如下:

    [csharp] view plain copy print ? sing System.Collections;   using System.Collections.Generic;   using LitJson;     [System.Serializable]   public class FamilyInfo {       public string name;       public int age;       public string tellphone;       public string address;  }     [System.Serializable]   public class FamilyList {       public List family_list;  }     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 () {              }  }  

    运行结果如下:

    但是这种方法灵活性太差,而且很容易发生错误。例如当我们不小心改变了变量名称,那么我们在面板里编辑好的数据就都会不见了!下面介绍另一种比较好的方法——把数据保存为本地的一个文本文件。

    第二种方法

    正如前面所说,我们把信息存成一个表格,并保存为txt格式。注意,为了能使用LitJson解析,txt中必须使用Json格式。 family.txt如下: [plain] view plain copy print ? {       "family_list": [           {               "name" : "candycat",               "age" : 21,               "tellphone" : "xxx",               "address" : "xxx"           },           {               "name" : "candycat#",               "age" : 22,               "tellphone" : "xxx",               "address" : "xxx"           },           {               "name" : "candycat##",               "age" : 23,               "tellphone" : "xxx",               "address" : "xxx"           }       ]  }   代码如下: [csharp] view plain copy print ? using UnityEngine;   using UnityEditor;   using System.Collections;   using System.Collections.Generic;   using LitJson;     public class FamilyInfo {       public string name;       public int age;       public string tellphone;       public string address;  }     public class FamilyList {       public List family_list;  }     public class LitJsonSample : MonoBehaviour {              public FamilyList m_FamilyList = null;              // Use this for initialization       void Start () {           ReloadFamilyData();                      DisplayFamilyList(m_FamilyList);       }              private void ReloadFamilyData()       {                      UnityEngine.TextAsset s = Resources.Load("Localize/family") as TextAsset;            string tmp = s.text;           m_FamilyList = JsonMapper.ToObject( tmp );           if ( JsonMapper.HasInterpretError() )           {               Debug.LogWarning( JsonMapper.GetInterpretError() );           }       }              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 () {              }  }   有几点注意的地方: 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等),否则无法正确解析!若需要小数,要使用double类型,而不能使用float,可后期在代码里再显式转换为float类型。

    结束语

    这个教程比较简单,希望大家可以从这个小例子里举一反三!我实习所做的这个项目里就经常使用这样的方法来初始化一些表格,这样也方便项目管理。感谢阅读。
    转载请注明原文地址: https://ju.6miu.com/read-1302870.html
    最新回复(0)