从标题的小卖萌就可以看出来这篇是博主倾注了心血的爱的干货٩(๑❛ᴗ❛๑)۶
转载请标明出处
啰啰嗦嗦的背景交代
这些天在写交易系统的时候,需要用到很多物品,它们还是有分类的,不同的有不同的描述。自己第一个想到的就是定义一个物品类,在一个结构体里把所有需要的属性(类别、名字、描述、加成buff啥的)都放进去,大概又可以写好多行了2333。这种方式也是我之前做过的方式,但这一次,博主多思考了一下,能不能把这些可修改的信息从代码中抽离出来,作为一个外部文件,以任何人都好理解和修改的方式存储。博主再一想,emmmmm…外部文件,先想到的就是表格,txt存储。再一想,这读取的时候必然会涉及到字符串、空格什么的处理的,博主觉得不够明朗简洁。就到网上去查阅了关于简洁快速的unity中数据存储的方式——JSON。 关于它,网上的博客教程都不尽相同,而且很乱。在这里,我整合看过的知识,结合自己遇到的问题提出相应的讲解方法,希望大家能够有所收获吧。
首先来介绍下,【摘自百度百科】
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
很惊讶的是,它在游戏服务器间的传输中已经算的是常用的处理方式了。好了,接下来进入正题:
1.JSON语法规则
•数据在键值对中
•数据由逗号分隔
•花括号保存对象
•方括号保存数组
2.JSON的结构
- 对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
- 数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
3.JSON在unity中使用前的准备
- JsonUtility:JsonUtility是Untiy5.3后新增的内容,有时会出现莫名其妙的错误:
JsonUtility.FromJson():把json字符串转成对象.
JsonUtility.ToJson():把对象转成json字符串. - LitJson:LitJson是一个Json的开源项目,这个比较稳定,推荐使用:
JsonMapper.ToObject():把json字符串转成对象.
JsonMapper.ToJson():把对象转成json字符串.
戳这里进官网下载,下载它的.dll文件就够了传送门
然后把.dll文件放在你的项目的Assets里,如图
使用的话要注意引入命名空间
以上,就完成了基本的了解和准备工作了。
结合代码介绍
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
Json创建中writer.WriteObjectStart ();就等同于“{”,writer.WriteObjectEnd ()就等同于“}”,最后要转换成string型,json = writer.ToString ();。解析Json时,JsonData jsonData = JsonMapper.ToObject (json);注意复合Json解析完了是一个数组。
JsonData实现的接口如下:
IJsonWrapper, IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary, IEquatable
string s = "[{'name':'lisi'},{'name':'zhangsan'}]";
string a = "{'name':'aaa'}";
JsonData[] jarr = JsonMapper.ToObject<JsonData[]>(s);
print(jarr. IsArray);//返回true
if(jarr.IsA