[Unity插件]LitJson杂谈
LitJson是一个开源项目,比较小巧轻便,安装也很简单,在Unity里只需要把LitJson.dll放到Plugins文件夹下,并在代码的最开头添加 “UsingLitJson”就可以了。简单来说,LitJson的用途是实现Json和代码数据之间的转换,一般用于从服务器请求数据,得到返回的Json后进行转换从而在代码里可以访问。具体请详见LitJson的官网。
关于和服务器数据之间的转换在此就不再赘述,官网以及一些博客里已有涉及,而且也比较详细了。
这里,主要谈一下LitJson的其他用途。
想象一个场景,你需要显示一个家庭信息的表格,这个表格的每一行代表了你的一个家人的名字、年龄、手机号码和住址等信息。因为这个信息不大,用数据库实在是大材小用,而且也很麻烦。
我们可以用一个数据结构来在代码里表示每个家人的信息:
[csharp]view plaincopyprint? publicclassFamilyInfo{ publicstringname; publicintage; publicstringtellphone; publicstringaddress; }
然后用一个List来表示家庭信息表:
[csharp]view plaincopyprint? publicclassFamilyList{ publicList<FamilyInfo>family_list; }
最后,打印信息: [csharp]view plaincopyprint? privatevoidDisplayFamilyList(FamilyListfamilyList){ if(familyList==null)return; foreach(FamilyInfoinfoinfamilyList.family_list){ Debug.Log("Name:"+info.name+"Age:"+info.age+"Tel:"+info.tellphone+"Addr:"+info.address); } }
准备工作都已经做好,那么数据到底在什么时候初始化呢?
第一种方法
一种方法是我们可以在编辑面板里直接初始化。为了达到目的,我们还需要告诉Unity编辑器在面板里显示我们的FamilyInfo,以便我们可以随机编辑,这是通过在类名前声明
[System.Serializable]来实现的。
具体代码如下:
[csharp]view plaincopyprint? singSystem.Collections; usingSystem.Collections.Generic; usingLitJson; [System.Serializable] publicclassFamilyInfo{ publicstringname; publicintage; publicstringtellphone; publicstringaddress; } [System.Serializable] publicclassFamilyList{ publicList<FamilyInfo>family_list; } publicclassLitJsonSample:MonoBehaviour{ publicFamilyListm_FamilyList=null; //Usethisforinitialization voidStart(){ DisplayFamilyList(m_FamilyList); } privatevoidDisplayFamilyList(FamilyListfamilyList){ if(familyList==null)return; foreach(FamilyInfoinfoinfamilyList.family_list){ Debug.Log("Name:"+info.name+"Age:"+info.age+"Tel:"+info.tellphone+"Addr:"+info.address); } } //Updateiscalledonceperframe voidUpdate(){ } }
但是这种方法灵活性太差,而且很容易发生错误。例如当我们不小心改变了变量名称,那么我们在面板里编辑好的数据就都会不见了!下面介绍另一种比较好的方法——把数据保存为本地的一个文本文件。
正如前面所说,我们把信息存成一个表格,并保存为txt格式。注意,为了能使用LitJson解析,txt中必须使用Json格式。 family.txt如下: [plain]view plaincopyprint? { "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 plaincopyprint? usingUnityEngine; usingUnityEditor; usingSystem.Collections; usingSystem.Collections.Generic; usingLitJson; publicclassFamilyInfo{ publicstringname; publicintage; publicstringtellphone; publicstringaddress; } publicclassFamilyList{ publicList<FamilyInfo>family_list; } publicclassLitJsonSample:MonoBehaviour{ publicFamilyListm_FamilyList=null; //Usethisforinitialization voidStart(){ ReloadFamilyData(); DisplayFamilyList(m_FamilyList); } privatevoidReloadFamilyData() { UnityEngine.TextAssets=Resources.Load("Localize/family")asTextAsset; stringtmp=s.text; m_FamilyList=JsonMapper.ToObject<FamilyList>(tmp); if(JsonMapper.HasInterpretError()) { Debug.LogWarning(JsonMapper.GetInterpretError()); } } privatevoidDisplayFamilyList(FamilyListfamilyList){ if(familyList==null)return; foreach(FamilyInfoinfoinfamilyList.family_list){ Debug.Log("Name:"+info.name+"Age:"+info.age+"Tel:"+info.tellphone+"Addr:"+info.address); } } //Updateiscalledonceperframe voidUpdate(){ } }
有几点注意的地方: 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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。