一.什么是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来序列化和反序列化,性能好。