一.什么是Json:
中午肚子餓了,到餐廳點餐。向服務員點了幾個菜,廚師根據用戶的需求,開始烹飪食物,食物烹飪好后,怎么將食物呈現給用戶呢?這時就需要用到盛放食物的碗了。用戶拿到盛放食物的碗,就可以獲得點的餐了。這個碗就充當了數據交換的容器了(^-^)
客戶端向服務器端發送請求后,服務器端怎么才能把用戶需要的數據返回給客戶端呢。這時我們就需要用一個指定的格式將數據,按照指定格式返回客戶端。這時就有了兩種數據傳輸的方式(XML和Json):
在普通的Web應用中,不管是服務器端還是客戶端解析XML代碼會非常麻煩,所以這時Json就更加滿足數據傳輸解析的要求。采用Json格式的方式進行數據的傳輸,不僅方便傳輸解析,還特別易於人閱讀和編寫
二.XML與Json轉換:
1.常規轉換:
<emp> <name>fxhl</name> <city>深圳</city> <age>23</age> </emp>
轉換為Json為:
{“name”:“fxhl”,"city":"深圳","age":23}
三.Json的表現形式:
1.對象:
{ "returnCode": "R0000", "returnMsg": "成功", "lessTimes": "2", "domainLink": "", "seqNum": "1", "identification": "595279", "isNeedImageCode": "false" }
2.數組:
{ "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }
3.數組對象混合:
這是截取的一小部分,對於比較復雜的Json格式的字符串,可以在線驗證json。格式化一個格式。方便觀看
-
-
- Json的表現形式一般就三種(對象,數組,字符串),使用過程中,只是將對象與數組進行混合了
-
{ "icon": [ { "title": "尚天貓,就購了", "icon_category": "baobei", "icon_key": "icon-service-tianmao", "trace": "srpservice", "innerText": "天貓寶貝", "url": "//www.tmall.com/" }, { "title": "保險理賠", "position": "99", "innerText": "分組-保險理賠", "iconPopupComplex":
{ "popup_title": "保險理賠", "subIcons": [ { "dom_class": "icon-service-yunfeixian", "icon_content": "賣家贈送退貨運費險" } ] } } ] }
四.Json序列化和反序列化的三種方式
1.使用JavaScriptSerializer類:
//使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中
using System.Web.Script.Serialization;
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //序列化操作 6 JavaScriptSerializer jss = new JavaScriptSerializer(); 7 var json = new { name = "fxhl", age = 23 }; 8 string str = jss.Serialize(json); 9 //反序列化操作 10 Person person = jss.Deserialize<Person>(str); 11 Console.WriteLine(person.name); 12 } 13 } 14 [Serializable] 15 public class Person 16 { 17 public string name { get; set; } 18 public int age { get; set; } 19 }
2.使用DataContractJsonSerializer類:
//Person實體中的契約 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的
//使用DataContractJsonSerializer方式需要引入的命名空間,在System.Runtime.Serialization.dll.中
using System.Runtime.Serialization.Json;
1 static void Main(string[] args) 2 { 3 //序列化操作 4 Person p1 = new Person() 5 { 6 name = "fxhl", 7 age = 23 8 }; 9 DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person)); 10 MemoryStream msObj = new MemoryStream(); 11 //將序列化之后的Json格式數據寫入流中 12 js.WriteObject(msObj, p1); 13 //從0這個位置開始讀取流中的數據 14 msObj.Position = 0; 15 StreamReader sr = new StreamReader(msObj, Encoding.UTF8); 16 string json = sr.ReadToEnd(); 17 Console.WriteLine(json); 18 sr.Close(); 19 msObj.Close(); 20 //反序列化操作 21 using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 22 { 23 DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Person)); 24 Person model = (Person)deseralizer.ReadObject(ms);// //反序列化ReadObject 25 Console.WriteLine(model.name); 26 } 27 Console.ReadKey(); 28 } 29 } 30 [DataContract] 31 public class Person 32 { 33 [DataMember] 34 public string name { get; set; } 35 [DataMember] 36 public int age { get; set; } 37 }
3.使用JSON.NET類庫:
引入類庫:
//使用Json.NET類庫需要引入的命名空間
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //序列化操作 6 var json = new { user = new { name = "fxhl", age = 23 }}; 7 string jsonData = JsonConvert.SerializeObject(json); 8 Console.WriteLine(jsonData); 9 //反序列化操作方法一 10 Person p1= JsonConvert.DeserializeObject<Person>(jsonData); 11 Console.WriteLine(p1.user.name); 12 //反序列化操作方法二 13 string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]"; 14 List<Person> listp2= JsonConvert.DeserializeObject<List<Person>>(json2); 15 Console.WriteLine(listp2[0].user.name); 16 Console.ReadKey(); 17 } 18 } 19 public class Person 20 { 21 public Person user { get; set; } 22 public string name { get; set; } 23 public int age { get; set; } 24 }
總結:最后還是盡量使用JSON.NET來序列化和反序列化,性能好。