Windows Phone 8 或者 Windows 8 平台對JSON資料的處理方式基本是一致的,需要使用DataContractJsonSerializer類將對象的執行個體序列化為JSON字串,並將字串還原序列化為對象的執行個體,需要注意的此種處理方式要求Json資料的格式固定的。
Json字串 => 對象
針對以下Json字串進行資料對象的構造解析
{ "name": "ZhangHui", "sex": "男", "cnblogs": { "address": "http://www.cnblogs.com/huizhang212/", "age": 2, "nickname": "宇之樂" }, "contacts": [ { "type": "QQ", "number": "411300114" }, { "type": "Email", "number": "huizhang212@163.com" } ]}
1.構造對象
分析上面json資料的格式,可以發現其中包含子物件cnblogs和子物件數組contacts,所以需要構造兩個子物件Cnblogs和Contact,對象代碼如下:
/// <summary> /// 人員部落格園論壇資訊 /// </summary> [DataContract] public class Cnblogs { [DataMember] public String nickname { get; set; } [DataMember] public int age { get; set; } [DataMember] public String address { get; set; } } /// <summary> /// 人員電話號碼資訊對象 /// </summary> [DataContract] public class Contact { [DataMember] public String type { get; set; } [DataMember] public String number { get; set; } }
子物件構建完成後,構建json資料對應的對象,記為:Person,代碼如下:
/// <summary> /// 人員資訊對象 /// </summary> [DataContract] public class Person { [DataMember] public String name { get; set; } [DataMember] public String sex { get; set; } [DataMember] public Cnblogs cnblogs { get; set; } [DataMember] public List<Contact> contacts { get; set; } }
構造對象必須有[DataContract]聲明,在通過DataContractJsonSerializer進行序號或者反序號的過程中只對有[DataMember]聲明的屬性生效,沒有[DataMember]聲明的屬性將會被忽略,對象屬性的大小寫需要和json資料對應欄位保持一致,否則該屬性的值無法擷取。
2.Json字串轉換Person對象的轉換函式實現
/// <summary> /// 解析json資料轉化為Person對象 /// </summary> /// <param name="json"></param> /// <returns></returns> public Person getPersionByJson(String json) { if (String.IsNullOrEmpty(json)) { return null; } try { Person info = new Person(); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)); DataContractJsonSerializer ser = new DataContractJsonSerializer(info.GetType()); info = ser.ReadObject(ms) as Person; return info; } catch { } return null; }
返回欄目頁:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/
3.調用getPersionByJson方法將Json字串轉換為對象
//Json資料 String json = @"{ ""name"": ""ZhangHui"", ""sex"": ""男"", ""cnblogs"": { ""address"": ""http://www.cnblogs.com/huizhang212/"", ""age"": 2, ""nickname"": ""宇之樂"" }, ""contacts"": [ { ""type"": ""QQ"", ""number"": ""411300114"" }, { ""type"": ""Email"", ""number"": ""huizhang212@163.com"" } ] }"; //json資料轉換為Person對象 Person person = getPersionByJson(json);
對象 => Json字串
通過DataContractJsonSerializer可以直接將對象轉換為Json字串。
1.Person對象轉換Json字串的函數實現
/// <summary> /// 獲Person對象的Json資料 /// </summary> /// <param name="normal"></param> /// <returns></returns> public String getJsonByPerson(Person person) { String json = String.Empty; try { MemoryStream ms = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType()); ser.WriteObject(ms, person); ms.Position = 0; using (StreamReader s = new StreamReader(ms)) { json = s.ReadToEnd(); } } catch { } return json; }
2.調用getJsonByPerson方法將Person對象轉換為Json字串
//構建一個Persion對象 Person person = new Person() { name = "ZhangHui", sex = "男", cnblogs = new Cnblogs() { nickname = "宇之樂", age = 2, address = "http://www.cnblogs.com/huizhang212/" }, contacts = new List<Contact>() { new Contact(){ type="QQ", number="411300114" }, new Contact(){ type="Email", number="huizhang212@163.com" } } }; //轉換為json資料 String personJson = getJsonByPerson(person);
作者:宇之樂
出處:http://www.cnblogs.com/huizhang212/