Unity JSON編碼解碼 之 LitJson 深度剖析
1: 什么是JSON
JSON(JavaScript Object Notation, JS對象簡譜)是一種輕量級的數(shù)據(jù)交換格式。它是基于
ECMAScript(European Computer Manufacturers Association, 歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。
簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。接下來看下JSON格式中定義的數(shù)據(jù)類型:

接下來看下一個示例的JSON文本:
{ status:0,isActive:false,damond: 100, HP: 65.4, Desic: “丹書鐵卷”, [100, false, {..}, [..], “hi”], }
注意: 其中Boolean, Double, Float, Int, Long, String屬于基本數(shù)據(jù)類型,Object, Array屬于容器,可以存放數(shù)據(jù),Object/Array中可以嵌套Object/Array。
搞懂了JSON的文本格式后,接下來分析下JSON編碼解碼的基本原理。
編碼/序列化: 任何編程語言的數(shù)據(jù)對象,最終的數(shù)據(jù)都可以用上面的類型來進行表示,最后把對應(yīng)的類型生成文本即可。
解碼/反序列化: 解析文本的類型符號,比如{,開頭就是Object, [ 開頭就是Array, 解析到true,false表示是Boolean類型。
JSON格式標準出來后,幾乎每個平臺的每種編程語言都有對應(yīng)的JSON庫來做編碼解碼,不用我們自己來實現(xiàn),在Unity C#里面我們經(jīng)常采用LitJson來做JSON文本的編碼解碼。
2: Unity中如何使用LitJson
Unity項目中使用LitJson,操作起來也十分簡單。接下來我們詳細的操作一下,具體步驟如下:
(1): 創(chuàng)建一個標準的Unity項目,下載LitJson的代碼庫,我一般會新建一個3rd文件夾,把LitJson的代碼庫放入到項目中,如圖所示:

(2): 編寫一個測試節(jié)點,掛一個測試代碼,用來測試與講解LitJson庫的使用,同時編寫一個JsonText.txt的文本資源,作為測試的Json文本,如圖:

(3): Json編碼
定義一個簡單的數(shù)據(jù)對象GameItem, 如下
class GameItem {
public int a;
public bool b;
public float c;
public string str;
}
創(chuàng)建一個GameItem 對象,并初始化里面的數(shù)據(jù),如下:
GameItem item = new GameItem ();
item.a = 10; item.b = false;
item.c = 74.0f; item.str = "hello";
調(diào)用JsonMapper的ToJson方法,把對象轉(zhuǎn)成Json String, 如下:
string jsonStr = JsonMapper.ToJson(item);
Debug.Log(jsonStr);
運行結(jié)果為: {"a":10,"b":false,"c":74,"str":"hello"},?

(4) Json解碼
從JsonText.txt文件里面加載TextAsset資源,或去資源中的文本對象,得到JsonStr, 調(diào)用JsonWrapper對象的ToObject方法得到JsonData的數(shù)據(jù)對象。
JsonData jsonObject = JsonMapper.ToObject(jsonTxt.text);
解析出來jsonObject后,可以根據(jù)json中的對象類型來直接訪問即可。
JsonData rst = jsonObject["rst"]; // 子Object對象
JsonData partnerList = rst["partnerCodeList"]; // 數(shù)組對象
JsonData partner0 = partnerList[0]; // 用數(shù)組方式訪問
JsonData可以強轉(zhuǎn)成任意的基本數(shù)據(jù)類型,string, float, double, boolean, int等。
注:具體的LitJson代碼可以關(guān)注我們,來獲取源碼。
3:LitJson核心源碼分析
LitJson使用起來如此簡單,那么它是具體怎么實現(xiàn)的呢?接下來我們來分析LitJson源碼來學(xué)習(xí)它代碼開發(fā)的一些技巧。首先要看下JsonData數(shù)據(jù)結(jié)構(gòu),在LitJson內(nèi)部,每個數(shù)據(jù)對象都是一個JsonData對象。

JsonData里面包含了一個JsonType type的數(shù)據(jù)成員,用來表示這個JsonData的數(shù)據(jù)對象是一個什么樣的數(shù)據(jù)類型。JsonType是一個枚舉,正好是所有可能的Json的數(shù)據(jù)類型,

如果這個數(shù)據(jù)類型是一個Boolean,數(shù)據(jù)值就存放在inst_boolean變量里面,如果數(shù)據(jù)類型是一個string, 數(shù)據(jù)值就存放在inst_string變量里面。
在JSON中,Object與Array是容器,所以在JsonData里面分別用Dictionary<string, JsonData>與List<JsonData>來作為Object與Array的容器,容器中的每個元素又是一個JsonData,所以就實現(xiàn)了容器中可以有容器對象+數(shù)據(jù)對象。
JsonData中重載了[]操作符,方便容器對象來去數(shù)據(jù),

Object 容器對象[key]操作重載

數(shù)組容器對象的[index]操作重載
JsonData中重載了類型強轉(zhuǎn)操作符,讓我們能直接通過強轉(zhuǎn)Json來獲取基本的數(shù)據(jù):
Int, Float, Double, Boolean, String。

通過強轉(zhuǎn)基本數(shù)據(jù)到JsonData,來獲取JsonData,?

這樣非常方便的讓我們生成了JsonData,非常方便的能通過JsonData獲取數(shù)據(jù)。
JsonWrapper來解析Json字符串的時候,就是讀取文本內(nèi)容,來根據(jù)對應(yīng)的Token符號來生成對應(yīng)的Json對象,具體可以閱讀源碼:

JSON與LitJson的分析就到這里了
感興趣的可以加一下我的學(xué)習(xí)交流群哦(我的簡介里有)