[Unity插件]LitJson杂谈

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

开场白


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

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

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

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

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

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class FamilyInfo {  
  2.     public string name;  
  3.     public int age;  
  4.     public string tellphone;  
  5.     public string address;  
  6. }  


然后用一个List来表示家庭信息表:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class FamilyList {  
  2.     public List<FamilyInfo> family_list;  
  3. }  


最后,打印信息:
[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private void DisplayFamilyList(FamilyList familyList) {  
  2.     if (familyList == nullreturn;  
  3.           
  4.     foreach (FamilyInfo info in familyList.family_list) {  
  5.         Debug.Log("Name:" + info.name + " Age:" + info.age + " Tel:" + info.tellphone + " Addr:" + info.address);  
  6.     }  
  7. }  
 

准备工作都已经做好,那么数据到底在什么时候初始化呢?

第一种方法

一种方法是我们可以在编辑面板里直接初始化。为了达到目的,我们还需要告诉Unity编辑器在面板里显示我们的FamilyInfo,以便我们可以随机编辑,这是通过在类名前声明

[System.Serializable]来实现的。

具体代码如下:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. sing System.Collections;  
  2. using System.Collections.Generic;  
  3. using LitJson;  
  4.   
  5. [System.Serializable]  
  6. public class FamilyInfo {  
  7.     public string name;  
  8.     public int age;  
  9.     public string tellphone;  
  10.     public string address;  
  11. }  
  12.   
  13. [System.Serializable]  
  14. public class FamilyList {  
  15.     public List<FamilyInfo> family_list;  
  16. }  
  17.   
  18. public class LitJsonSample : MonoBehaviour {  
  19.       
  20.     public FamilyList m_FamilyList = null;  
  21.       
  22.     // Use this for initialization  
  23.     void Start () {  
  24.         DisplayFamilyList(m_FamilyList);  
  25.     }  
  26.       
  27.     private void DisplayFamilyList(FamilyList familyList) {  
  28.         if (familyList == nullreturn;  
  29.           
  30.         foreach (FamilyInfo info in familyList.family_list) {  
  31.             Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
  32.         }  
  33.     }  
  34.       
  35.     // Update is called once per frame  
  36.     void Update () {  
  37.       
  38.     }  
  39. }  


运行结果如下:


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


第二种方法


正如前面所说,我们把信息存成一个表格,并保存为txt格式。注意,为了能使用LitJson解析,txt中必须使用Json格式。
family.txt如下:
[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. {  
  2.     "family_list": [  
  3.         {  
  4.             "name" : "candycat",  
  5.             "age" : 21,  
  6.             "tellphone" : "xxx",  
  7.             "address" : "xxx"  
  8.         },  
  9.         {  
  10.             "name" : "candycat#",  
  11.             "age" : 22,  
  12.             "tellphone" : "xxx",  
  13.             "address" : "xxx"  
  14.         },  
  15.         {  
  16.             "name" : "candycat##",  
  17.             "age" : 23,  
  18.             "tellphone" : "xxx",  
  19.             "address" : "xxx"  
  20.         }  
  21.     ]  
  22. }  

代码如下:
[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. using UnityEngine;  
  2. using UnityEditor;  
  3. using System.Collections;  
  4. using System.Collections.Generic;  
  5. using LitJson;  
  6.   
  7. public class FamilyInfo {  
  8.     public string name;  
  9.     public int age;  
  10.     public string tellphone;  
  11.     public string address;  
  12. }  
  13.   
  14. public class FamilyList {  
  15.     public List<FamilyInfo> family_list;  
  16. }  
  17.   
  18. public class LitJsonSample : MonoBehaviour {  
  19.       
  20.     public FamilyList m_FamilyList = null;  
  21.       
  22.     // Use this for initialization  
  23.     void Start () {  
  24.         ReloadFamilyData();  
  25.           
  26.         DisplayFamilyList(m_FamilyList);  
  27.     }  
  28.       
  29.     private void ReloadFamilyData()  
  30.     {             
  31.         UnityEngine.TextAsset s = Resources.Load("Localize/family"as TextAsset;   
  32.         string tmp = s.text;  
  33.         m_FamilyList = JsonMapper.ToObject<FamilyList>( tmp );  
  34.         if ( JsonMapper.HasInterpretError() )  
  35.         {  
  36.             Debug.LogWarning( JsonMapper.GetInterpretError() );  
  37.         }  
  38.     }  
  39.       
  40.     private void DisplayFamilyList(FamilyList familyList) {  
  41.         if (familyList == nullreturn;  
  42.           
  43.         foreach (FamilyInfo info in familyList.family_list) {  
  44.             Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);  
  45.         }  
  46.     }  
  47.       
  48.     // Update is called once per frame  
  49.     void Update () {  
  50.       
  51.     }  
  52. }  

有几点注意的地方:
  • 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,如需转载请自行联系原作者
相关文章
|
3月前
|
传感器 开发工具 vr&ar
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
201 0
|
5月前
|
图形学
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
286 0
|
5月前
|
数据可视化 大数据 API
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
184 0
|
5月前
|
自然语言处理 搜索推荐 API
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
187 0
|
5月前
|
JSON 开发框架 API
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
428 0
|
5月前
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
99 0
|
5月前
|
数据可视化 C# 图形学
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
145 0
|
5月前
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
140 0
|
5月前
|
vr&ar 图形学
【推荐100个unity插件之16】3D物品描边效果——Quick Outline免费插件
【推荐100个unity插件之16】3D物品描边效果——Quick Outline免费插件
204 0