前言
最近在研究Android項目,其中涉及到Android中解析Json數據的問題,需要模擬網絡中傳遞Json數據的模式,因為以前是.net的工程師,所以想着從.net的平台開發服務,傳遞Json格式的數據。那么先來介紹一些什么是JSON。
JSON
Json(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於JS的一個子集。 Json采用完全獨立於語言的文本格式。這使得Json成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。
Json簡單來說就是JS中的對象和數組,所以Json也存在兩種結構:對象、數組。
- Json對象:Json對象定義在花括號“{}”內,以Key:value鍵值對的形式存放數據,多個數據使用分號“;”分割。
- Json數組:Json數組定義在方括號“[]”內,以字符串的形式存放數據,多個數據使用分號“;”分割。
Json序列化與反序列化
對於.Net而言,從3.5之后就提供了DataContractJsonSerializer類,需要引用DLL,System.Runtime.Serialization。使用方式很簡單,需要知道待轉換的對象的類型,然后通過MemoryStream流寫入的方式轉換。對於DataContractJsonSerializer對象而言,序列化和反序列化只需要了解兩個方法即可,這兩個方法都具有多放重載,適用於不同的環境,這兩個方法是:
- WriteObject:將指定對象序列化為Json數據,並將生成的 Json寫入流中。
- ReadObject:以 Json格式讀取文檔流,並返回反序列化的對象。
使用DataContractJsonSerializer序列化對象和反序列化Json都比較簡單,下面給出示例代碼:
1 private static string getJsonByObject(Object obj) 2 { 3 //實例化DataContractJsonSerializer對象,需要待序列化的對象類型 4 DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 5 //實例化一個內存流,用於存放序列化后的數據 6 MemoryStream stream = new MemoryStream(); 7 //使用WriteObject序列化對象 8 serializer.WriteObject(stream, obj); 9 //寫入內存流中 10 byte[] dataBytes = new byte[stream.Length]; 11 stream.Position = 0; 12 stream.Read(dataBytes, 0, (int)stream.Length); 13 //通過UTF8格式轉換為字符串 14 return Encoding.UTF8.GetString(dataBytes); 15 } 16 17 private static Object getObjectByJson(string jsonString, Object obj) 18 { 19 //實例化DataContractJsonSerializer對象,需要待序列化的對象類型 20 DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 21 //把Json傳入內存流中保存 22 MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 23 // 使用ReadObject方法反序列化成對象 24 return serializer.ReadObject(stream); 25 }
通過這個轉換類,可以對對象進行序列化成Json和反序列化成對象。但是存在一個問題,就是對於集合類型的數據,可以序列化成Json,但是把這個Json反序列化則會失敗,我在這里也沒有找到更好的辦法反序列化集合類型的數據。現在就一些常見.Net類型的數據進行序列化展示。
新建一個獲取數據的類JsonObject,在其中分別返回一個Person(id,name,age)對象、List<Person>對象、List<string>對象,List<Dictionary<string, object>>對象,分別看看序列化后的數據。
JsonObject類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace WebDemo.Json 7 { 8 static public class JsonObject 9 { 10 static public Person getPerson() 11 { 12 Person person = new Person(); 13 person.id = 20; 14 person.name = "slive"; 15 person.age = 24; 16 return person; 17 } 18 static public List<Person> getPersonList() 19 { 20 List<Person> personList = new List<Person>(); 21 Person person = new Person(); 22 person.id = 20; 23 person.name = "slive"; 24 person.age = 24; 25 Person person2 = new Person(); 26 person2.id = 30; 27 person2.name = "jack"; 28 person2.age = 34; 29 Person person3 = new Person(); 30 person3.id = 40; 31 person3.name = "damon"; 32 person3.age = 54; 33 personList.Add(person); 34 personList.Add(person2); 35 personList.Add(person3); 36 return personList; 37 } 38 static public List<string> getStringList() 39 { 40 List<string> stringlist = new List<string>(); 41 stringlist.Add("jack"); 42 stringlist.Add("dick"); 43 stringlist.Add("sean"); 44 return stringlist; 45 } 46 static public List<Dictionary<string,object>> getDicList() 47 { 48 List<Dictionary<string, object>> dicList = new List<Dictionary<string, object>>(); 49 Dictionary<string, object> dic1 = new Dictionary<string, object>(); 50 dic1.Add("id", 17); 51 dic1.Add("name", "jerry"); 52 dic1.Add("age", 24); 53 Dictionary<string, object> dic2 = new Dictionary<string, object>(); 54 dic2.Add("id", 18); 55 dic2.Add("name", "meimei"); 56 dic2.Add("age", 23); 57 Dictionary<string, object> dic3 = new Dictionary<string, object>(); 58 dic3.Add("id", 19); 59 dic3.Add("name", "damon"); 60 dic3.Add("age", 28); 61 dicList.Add(dic1); 62 dicList.Add(dic2); 63 dicList.Add(dic3); 64 return dicList; 65 } 66 } 67 }
分別對JsonObject返回的數據進行序列化,可以看到結果:
- getPerson():{"age":24,"id":20,"name":"slive"}
- getPersonList():[{"age":24,"id":20,"name":"slive"},{"age":34,"id":30,"name":"jack"},{"age":54,"id":40,"name":"damon"}]
- getStringList():["jack","dick","sean"]
- getDicList():[[{"Key":"id","Value":17},{"Key":"name","Value":"jerry"},{"Key":"age","Value":24}],[{"Key":"id","Value":18},{"Key":"name","Value":"meimei"},{"Key":"age","Value":23}],[{"Key":"id","Value":19},{"Key":"name","Value":"damon"},{"Key":"age","Value":28}]]
總結
最近一直在研究Android開發,所以涉及到Json的解析問題,才會想着找找對於Json對象的序列化的實現。Json作為一個獨立於語言的文本,使用什么語言並不重要,這里只是需要把數據對象序列化為Json,傳遞給Android客戶端做准備,雖然這種方式對於集合的反序列化存在問題,但是不影響序列化與數據傳遞。
請支持原創,尊重原創,轉載請注明出處。謝謝。