json 反序列化 父子类型_Json的序列化和反序列化

本文介绍了Json的用途,对比了XML与Json,展示了Json三种表现形式:对象、数组和混合类型,并详细讲解了使用JavaScriptSerializer,DataContractJsonSerializer和JSON.NET进行Json序列化和反序列化的实例代码,强调了JSON.NET在性能上的优势。
摘要由CSDN通过智能技术生成

一.什么是Json:

中午肚子饿了,到餐厅点餐。向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了。用户拿到盛放食物的碗,就可以获得点的餐了。这个碗就充当了数据交换的容器了(^-^)

客户端向服务器端发送请求后,服务器端怎么才能把用户需要的数据返回给客户端呢。这时我们就需要用一个指定的格式将数据,按照指定格式返回客户端。这时就有了两种数据传输的方式(XML和Json):

在普通的Web应用中,不管是服务器端还是客户端解析XML代码会非常麻烦,所以这时Json就更加满足数据传输解析的要求。采用Json格式的方式进行数据的传输,不仅方便传输解析,还特别易于人阅读和编写

二.XML与Json转换:

1.常规转换:

fxhl

深圳

23

转换为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 classProgram2 {3 static void Main(string[] args)4 {5 //序列化操作

6 JavaScriptSerializer jss = newJavaScriptSerializer();7 var json = new { name = "fxhl", age = 23};8 string str =jss.Serialize(json);9 //反序列化操作

10 Person person = jss.Deserialize(str);11 Console.WriteLine(person.name);12 }13 }14 [Serializable]15 public classPerson16 {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 = newPerson()5 {6 name = "fxhl",7 age = 23

8 };9 DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));10 MemoryStream msObj = newMemoryStream();11 //将序列化之后的Json格式数据写入流中

12 js.WriteObject(msObj, p1);13 //从0这个位置开始读取流中的数据

14 msObj.Position = 0;15 StreamReader sr = newStreamReader(msObj, Encoding.UTF8);16 string json =sr.ReadToEnd();17 Console.WriteLine(json);18 sr.Close();19 msObj.Close();20 //反序列化操作

21 using (var ms = newMemoryStream(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 classPerson32 {33 [DataMember]34 public string name { get; set; }35 [DataMember]36 public int age { get; set; }37 }

3.使用JSON.NET类库:

引入类库:

//使用Json.NET类库需要引入的命名空间

1 classProgram2 {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(jsonData);11 Console.WriteLine(p1.user.name);12 //反序列化操作方法二

13 string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]";14 List listp2= JsonConvert.DeserializeObject>(json2);15 Console.WriteLine(listp2[0].user.name);16 Console.ReadKey();17 }18 }19 public classPerson20 {21 public Person user { get; set; }22 public string name { get; set; }23 public int age { get; set; }24 }

总结:最后还是尽量使用JSON.NET来序列化和反序列化,性能好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值