中午肚子餓了,到餐廳點餐。向服務員點了幾個菜,廚師根據用戶的需求,開始烹飪食物,食物烹飪好後,怎麼將食物呈現給用戶呢?這時就須要用到盛放食物的碗了。用戶拿到盛放食物的碗,就能夠得到點的餐了。這個碗就充當了數據交換的容器了(^-^)json
客戶端向服務器端發送請求後,服務器端怎麼才能把用戶須要的數據返回給客戶端呢。這時咱們就須要用一個指定的格式將數據,按照指定格式返回客戶端。這時就有了兩種數據傳輸的方式(XML和Json):數組
在普通的Web應用中,無論是服務器端仍是客戶端解析XML代碼會很是麻煩,因此這時Json就更加知足數據傳輸解析的要求。採用Json格式的方式進行數據的傳輸,不只方便傳輸解析,還特別易於人閱讀和編寫服務器
1.常規轉換:less
<emp> <name>fxhl</name> <city>深圳</city> <age>23</age> </emp>
轉換爲Json爲:dom
{「name」:「fxhl」,"city":"深圳","age":23}ide
1.對象:post
{ "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.數組對象混合:
url
這是截取的一小部分,對於比較複雜的Json格式的字符串,能夠在線驗證json。格式化一個格式。方便觀看spa
{ "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": "賣家贈送退貨運費險" } ] } } ] }
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來序列化和反序列化,性能好。