LitJson

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

开场白

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

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

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

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

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

[csharp] view plaincopyprint?

  1. public class FamilyInfo {
  2. public string name;
  3. public int age;
  4. public string tellphone;
  5. public string address;
  6. }

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

[csharp] view plaincopyprint?

  1. public class FamilyList {
  2. public List<FamilyInfo> family_list;
  3. }

最后,打印信息:

[csharp] view plaincopyprint?

  1. private void DisplayFamilyList(FamilyList familyList) {
  2. if (familyList == null) return;
  3. foreach (FamilyInfo info in familyList.family_list) {
  4. Debug.Log("Name:" + info.name + " Age:" + info.age + " Tel:" + info.tellphone + " Addr:" + info.address);
  5. }
  6. }

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

第一种方法

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

[System.Serializable]来实现的。

具体代码如下:

[csharp] view plaincopyprint?

  1. sing System.Collections;
  2. using System.Collections.Generic;
  3. using LitJson;
  4. [System.Serializable]
  5. public class FamilyInfo {
  6. public string name;
  7. public int age;
  8. public string tellphone;
  9. public string address;
  10. }
  11. [System.Serializable]
  12. public class FamilyList {
  13. public List<FamilyInfo> family_list;
  14. }
  15. public class LitJsonSample : MonoBehaviour {
  16. public FamilyList m_FamilyList = null;
  17. // Use this for initialization
  18. void Start () {
  19. DisplayFamilyList(m_FamilyList);
  20. }
  21. private void DisplayFamilyList(FamilyList familyList) {
  22. if (familyList == null) return;
  23. foreach (FamilyInfo info in familyList.family_list) {
  24. Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);
  25. }
  26. }
  27. // Update is called once per frame
  28. void Update () {
  29. }
  30. }

运行结果如下:

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

第二种方法

正如前面所说,我们把信息存成一个表格,并保存为txt格式。注意,为了能使用LitJson解析,txt中必须使用Json格式。

family.txt如下:

[plain] view plaincopyprint?

  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 plaincopyprint?

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using LitJson;
  6. public class FamilyInfo {
  7. public string name;
  8. public int age;
  9. public string tellphone;
  10. public string address;
  11. }
  12. public class FamilyList {
  13. public List<FamilyInfo> family_list;
  14. }
  15. public class LitJsonSample : MonoBehaviour {
  16. public FamilyList m_FamilyList = null;
  17. // Use this for initialization
  18. void Start () {
  19. ReloadFamilyData();
  20. DisplayFamilyList(m_FamilyList);
  21. }
  22. private void ReloadFamilyData()
  23. {
  24. UnityEngine.TextAsset s = Resources.Load("Localize/family") as TextAsset;
  25. string tmp = s.text;
  26. m_FamilyList = JsonMapper.ToObject<FamilyList>( tmp );
  27. if ( JsonMapper.HasInterpretError() )
  28. {
  29. Debug.LogWarning( JsonMapper.GetInterpretError() );
  30. }
  31. }
  32. private void DisplayFamilyList(FamilyList familyList) {
  33. if (familyList == null) return;
  34. foreach (FamilyInfo info in familyList.family_list) {
  35. Debug.Log("Name:" + info.name + "       Age:" + info.age + "        Tel:" + info.tellphone + "      Addr:" + info.address);
  36. }
  37. }
  38. // Update is called once per frame
  39. void Update () {
  40. }
  41. }

有几点注意的地方:

  • 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类型。

结束语

这个教程比较简单,希望大家可以从这个小例子里举一反三!我实习所做的这个项目里就经常使用这样的方法来初始化一些表格,这样也方便项目管理。感谢阅读

时间: 2024-08-29 13:15:43

LitJson的相关文章

XML数据 JSON数据 LitJSON 数据 的编写和解析 小结

用XML生成如下数据<?xml version="1.0"encoding="UTF-8"?><Transform name="MyCube" ><Position><X>11</X><Y>89</Y><Z>20</Z></Position></Transform> 操作如下 在C#脚本中 // 创建一个文档XmlD

LitJson的用法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LitJson; namespace testLitJson { class Program { static void Main(string[] args) { string str= Console.ReadLine(); if (str == "k

【转】在Unity中读写文件数据:LitJSON快速教程

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 介绍 JSON是一个简单的,但功能强大的序列化数据格式.它定义了简单的类型,如布尔,数(int和float)和字符串,和几个数据结构:list和dictionnary.可以在http://JSON.org了解关于JSON的更多信息. litjson是用C #编写的,它的目的是要小,快速,易用.它使用了Mono框架. 安装LitJSON 将Li

C#使用LitJson对Json数据解析

官网:(json.org/json-zh.html   <可选中文>) JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Jav

C#使用LitJson解析JSON(转)

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 如果曾经使用过J

Unity LitJson

使用LitJson 和JsonMapper读取json文件和写json文件 这个是类结构. 接下来是读写函数 接下来是test_1的内容: 代码很简单,不做解释, 做为备份.

LitJson使用方法

原文地址:http://lbv.github.io/litjson/docs/quickstart.html 一. using LitJson; using System; public class Person { // C# 3.0 auto-implemented properties public string Name { get; set; } public int Age { get; set; } public DateTime Birthday { get; set; } }

LitJson处理Json

LitJSON是一个.NET平台下处理JSON格式数据的类库,小巧.快速.它的源代码使用C#编写,可以通过任何.Net平台上的语言进行调用,目前最新版本为LitJSON 0.9. 下载地址: http://lbv.github.io/litjson/ Unity基本上都使用这个dll来解析Json.下载dll放入Plugins文件夹,引用命名空间using LitJson就可以正常使用啦O(∩_∩)O~     我们来看看Json的使用方式: 第一种解析Json public void Anal

Unity3D使用Litjson序列化

var jsonStr = JsonMapper.ToJson(tmpType); var tmpObject = JsonMapper.ToObject<TestClass>(jsonStr); 序列化和反序列化. 需要注意float类型要转换成double类型,否则会出错. 序列化对私有成员似乎无效,还是要全public出来. Dictionary成员,key必须是string类型. Unity3D使用Litjson序列化,布布扣,bubuko.com

(转)LitJson 遍历key

本文转载自:http://blog.csdn.net/inlet511/article/details/47127579 用LitJson插件获取到的对象,如果想遍历对象中包含的子对象的key,可以用如下方法: string data = "{ "key1":"value1","key2":"value2","key3":"value3" }"; JsonData j