Json在Unity中的使用

本文知識點轉自:http://www.cnblogs.com/qiaogaojian/p/6532665.html,請點選連結檢視原文,尊重樓主版權。

本文程式碼案例轉自:雨鬆MOMO,請點選連結檢視原文,尊重樓主版權。

Json在Unity中的使用


1.什麼是Json?

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。它基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C、C 、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。

2.JSON 語法規則

–資料在鍵值對中
–資料由逗號分隔
–花括號儲存物件
–方括號儲存陣列

3.Json的結構

–物件:物件在js中表示為“{}”括起來的內容,資料結構為 {key:value,key:value,…}的鍵值對的結構,在物件導向的語言中,key為物件的屬性,value為對應的屬性值,所以很容易理解,取值方法為 物件.key 獲取屬性值,這個屬性值的型別可以是 數字、字串、陣列、物件幾種。
–陣列:陣列在js中是中括號“[]”括起來的內容,資料結構為 [“java”,”javascript”,”vb”,…],取值方式和所有語言中一樣,使用索引獲取,欄位值的型別可以是 數字、字串、陣列、物件幾種。

4.Json在Unity3d中的使用

1/ JsonUtility

JsonUtility是Untiy5.3後新增的內容,有時會出現莫名其妙的錯誤。
JsonUtility.FromJson():把json字串轉成物件.
JsonUtility.ToJson():把物件轉成json字串.

2/ LitJson:

LitJson是一個Json的開源專案,這個比較穩定,推薦使用,官網:http://lbv.github.io/litjson/下載LitJson.dll(沒有vpn的親:連結:http://pan.baidu.com/s/1i57ozml 密碼:eyd4)

JsonMapper.ToObject():把json字串轉成物件.
JsonMapper.ToJson():把物件轉成json字串.

使用時,dll檔案要放在Plugins資料夾下,程式碼訪問時要引用名稱空間:using LitJson;

示例程式碼:

1/ 解析json:

public void ResolveJson()  
{  
//定義的JSON字串,注意JSON的格式  
string str = @"  
{  
""Name""     : ""yusong"",  
""Age""      : 26,  
""Birthday"" : ""1986-11-21"",  
""Thumbnail"":[  
{  
""Url"":    ""http://xuanyusong.com"",  
""Height"": 256,  
""Width"":  ""200""  
},  
{  
""Url"":    ""http://baidu.com"",  
""Height"": 1024,  
""Width"":  ""500""  
}  
]  
}";  
//這裡是解析,包括整形與字串  
JsonData jd = JsonMapper.ToObject(str);  
Debug.Log("name = "   (string)jd["Name"]);  
Debug.Log("Age = "   (int)jd["Age"]);  
Debug.Log("Birthday = "   (string)jd["Birthday"]);  
JsonData jdItems = jd["Thumbnail"];   
for (int i = 0; i < jdItems.Count; i  )  
{  
Debug.Log("URL = "   jdItems[i]["Url"]);  
Debug.Log("Height = "   (int)jdItems[i]["Height"]);  
Debug.Log("Width = "   jdItems[i]["Width"]);  
}  
}  

執行結果:

2.合成json:

public void MergerJson()  
{  
StringBuilder sb = new StringBuilder ();  
JsonWriter writer = new JsonWriter (sb);  
writer.WriteObjectStart ();  
writer.WritePropertyName ("Name");  
writer.Write ("yusong");  
writer.WritePropertyName ("Age");  
writer.Write (26);  
writer.WritePropertyName ("Girl");  
writer.WriteArrayStart ();  
writer.WriteObjectStart();  
writer.WritePropertyName("name");  
writer.Write("ruoruo");  
writer.WritePropertyName("age");  
writer.Write(24);  
writer.WriteObjectEnd ();  
writer.WriteObjectStart();  
writer.WritePropertyName("name");  
writer.Write("momo");  
writer.WritePropertyName("age");  
writer.Write(26);  
writer.WriteObjectEnd ();  
writer.WriteArrayEnd();  
writer.WriteObjectEnd ();  
Debug.Log(sb.ToString ());  
JsonData jd = JsonMapper.ToObject(sb.ToString ());  
Debug.Log("name = "   (string)jd["Name"]);  
Debug.Log("Age = "   (int)jd["Age"]);  
JsonData jdItems = jd["Girl"];  
for (int i = 0; i < jdItems.Count; i  )  
{  
Debug.Log("Girl name = "   jdItems[i]["name"]);  
Debug.Log("Girl age = "   (int)jdItems[i]["age"]);  
}  
}  

結果:

注意:

使用LitJson解析時,解析類時
若包含Dictionary結構,則key的型別必須是string,而不能是int型別(如需表示id等),否則無法正確解析!
若需要小數,要使用double型別,而不能使用float,可後期在程式碼裡再顯式轉換為float型別。