欢迎光临散文网 会员登陆 & 注册

Unity JSON编码解码 之 LitJson 深度剖析

2022-08-19 16:09 作者:游戏开发RAIN  | 我要投稿

1: 什么是JSON


JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它是基于

ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。接下来看下JSON格式中定义的数据类型:



接下来看下一个示例的JSON文本:

{ status:0,isActive:false,damond: 100, HP: 65.4, Desic: “丹书铁卷”, [100, false, {..}, [..], “hi”], }

注意: 其中Boolean, Double, Float, Int, Long, String属于基本数据类型,Object, Array属于容器,可以存放数据,Object/Array中可以嵌套Object/Array。


搞懂了JSON的文本格式后,接下来分析下JSON编码解码的基本原理。

编码/序列化: 任何编程语言的数据对象,最终的数据都可以用上面的类型来进行表示,最后把对应的类型生成文本即可。

解码/反序列化: 解析文本的类型符号,比如{,开头就是Object, [ 开头就是Array, 解析到true,false表示是Boolean类型。


JSON格式标准出来后,几乎每个平台的每种编程语言都有对应的JSON库来做编码解码,不用我们自己来实现,在Unity C#里面我们经常采用LitJson来做JSON文本的编码解码。


2: Unity中如何使用LitJson

Unity项目中使用LitJson,操作起来也十分简单。接下来我们详细的操作一下,具体步骤如下:

(1): 创建一个标准的Unity项目,下载LitJson的代码库,我一般会新建一个3rd文件夹,把LitJson的代码库放入到项目中,如图所示:

(2): 编写一个测试节点,挂一个测试代码,用来测试与讲解LitJson库的使用,同时编写一个JsonText.txt的文本资源,作为测试的Json文本,如图:

(3): Json编码

定义一个简单的数据对象GameItem, 如下

class GameItem {

public int a;

public bool b;

public float c;

public string str;

}

创建一个GameItem 对象,并初始化里面的数据,如下:

GameItem item = new GameItem ();

item.a = 10; item.b = false;

item.c = 74.0f; item.str = "hello";


调用JsonMapper的ToJson方法,把对象转成Json String, 如下:

string jsonStr = JsonMapper.ToJson(item);

Debug.Log(jsonStr);

运行结果为: {"a":10,"b":false,"c":74,"str":"hello"}, 

(4) Json解码

从JsonText.txt文件里面加载TextAsset资源,或去资源中的文本对象,得到JsonStr, 调用JsonWrapper对象的ToObject方法得到JsonData的数据对象。

JsonData jsonObject = JsonMapper.ToObject(jsonTxt.text);

解析出来jsonObject后,可以根据json中的对象类型来直接访问即可。

JsonData rst = jsonObject["rst"]; // 子Object对象

JsonData partnerList = rst["partnerCodeList"]; // 数组对象

JsonData partner0 = partnerList[0]; // 用数组方式访问

JsonData可以强转成任意的基本数据类型,string, float, double, boolean, int等。

:具体的LitJson代码可以关注我们,来获取源码。


3:LitJson核心源码分析


LitJson使用起来如此简单,那么它是具体怎么实现的呢?接下来我们来分析LitJson源码来学习它代码开发的一些技巧。首先要看下JsonData数据结构,在LitJson内部,每个数据对象都是一个JsonData对象。

JsonData里面包含了一个JsonType type的数据成员,用来表示这个JsonData的数据对象是一个什么样的数据类型。JsonType是一个枚举,正好是所有可能的Json的数据类型,

如果这个数据类型是一个Boolean,数据值就存放在inst_boolean变量里面,如果数据类型是一个string, 数据值就存放在inst_string变量里面。

在JSON中,Object与Array是容器,所以在JsonData里面分别用Dictionary<string, JsonData>与List<JsonData>来作为Object与Array的容器,容器中的每个元素又是一个JsonData,所以就实现了容器中可以有容器对象+数据对象。

JsonData中重载了[]操作符,方便容器对象来去数据,

Object 容器对象[key]操作重载

数组容器对象的[index]操作重载

JsonData中重载了类型强转操作符,让我们能直接通过强转Json来获取基本的数据:

Int, Float, Double, Boolean, String。

通过强转基本数据到JsonData,来获取JsonData, 

这样非常方便的让我们生成了JsonData,非常方便的能通过JsonData获取数据。

JsonWrapper来解析Json字符串的时候,就是读取文本内容,来根据对应的Token符号来生成对应的Json对象,具体可以阅读源码:

JSON与LitJson的分析就到这里了

感兴趣的可以加一下我的学习交流群哦(我的简介里有)

Unity JSON编码解码 之 LitJson 深度剖析的评论 (共 条)

分享到微博请遵守国家法律