仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 548|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET编程:ASP.NET中JSON的序列化和反序列化

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-16 22:18:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)</p>导读:JSON是专门为扫瞄器中的网页上运转的JavaScript代码而计划的一种数据格局。在网站使用中利用JSON的场景愈来愈多,本文先容ASP.NET中JSON的序列化和反序列化,次要对JSON的复杂先容,ASP.NET怎样序列化和反序列化的处置,在序列化和反序列化对日期工夫、汇合、字典的处置。
1、JSON简介
JSON(JavaScriptObjectNotation,JavaScript工具暗示法)是一种轻量级的数据互换格局。
JSON是“名值对”的汇合。布局由年夜括号{},中括号[],逗号,,冒号:,双引号“”构成,包括的数据范例有Object,Number,Boolean,String,Array,NULL等。
JSON具有以下的情势:
工具(Object)是一个无序的“名值对”汇合,一个工具以”{”入手下手,”}”停止。每一个“名”后随着一个”:”,多个“名值对”由逗号分开。如:
varuser={"name":"张三","gender":"男","birthday":"1980-8-8"}
数组(Array)是值的有序汇合,一个数组以“[”入手下手,以“]”停止,值之间利用“,”分开。如:
varuserlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}];
字符串(String)是由双引号包抄的恣意数目的Unicode字符的汇合,利用反斜线本义。
2、对JSON数据举行序列化和反序列化
可使用DataContractJsonSerializer类将范例实例序列化为JSON字符串,并将JSON字符串反序列化为范例实例。DataContractJsonSerializer在System.Runtime.Serialization.Json定名空间下,.NETFramework3.5包括在System.ServiceModel.Web.dll中,必要增加对其的援用;.NETFramework4在System.Runtime.Serialization中。
使用DataContractJsonSerializer序列化和反序列化的代码:
1:usingSystem;
2:usingSystem.Collections.Generic;
3:usingSystem.Linq;
4:usingSystem.Web;
5:usingSystem.Runtime.Serialization.Json;
6:usingSystem.IO;
7:usingSystem.Text;
8:
9:///<summary>
10:///JSON序列化和反序列化帮助类
11:///</summary>
12:publicclassJsonHelper
13:{
14:///<summary>
15:///JSON序列化
16:///</summary>
17:publicstaticstringJsonSerializer<T>(Tt)
18:{
19:DataContractJsonSerializerser=newDataContractJsonSerializer(typeof(T));
20:MemoryStreamms=newMemoryStream();
21:ser.WriteObject(ms,t);
22:stringjsonString=Encoding.UTF8.GetString(ms.ToArray());
23:ms.Close();
24:returnjsonString;
25:}
26:
27:///<summary>
28:///JSON反序列化
29:///</summary>
30:publicstaticTJsonDeserialize<T>(stringjsonString)
31:{
32:DataContractJsonSerializerser=newDataContractJsonSerializer(typeof(T));
33:MemoryStreamms=newMemoryStream(Encoding.UTF8.GetBytes(jsonString));
34:Tobj=(T)ser.ReadObject(ms);
35:returnobj;
36:}
37:}
序列化Demo:
复杂工具Person:
1:publicclassPerson
2:{
3:publicstringName{get;set;}
4:publicintAge{get;set;}
5:}
序列化为JSON字符串:
1:protectedvoidPage_Load(objectsender,EventArgse)
2:{
3:Personp=newPerson();
4:p.Name="张三";
5:p.Age=28;
6:
7:stringjsonString=JsonHelper.JsonSerializer<Person>(p);
8:Response.Write(jsonString);
9:}
输入了局:
{"Age":28,"Name":"张三"}
反序列化Demo:
1:protectedvoidPage_Load(objectsender,EventArgse)
2:{
3:stringjsonString="{"Age":28,"Name":"张三"}";
4:Personp=JsonHelper.JsonDeserialize<Person>(jsonString);
5:}
运转了局:
ASP.NET中的JSON序列化和反序列化还可使用JavaScriptSerializer,在System.Web.Script.Serializatioin定名空间下,需援用System.Web.Extensions.dll.也能够利用JSON.NET.
3、JSON序列化和反序列化日期工夫的处置
JSON格局不间接撑持日期和工夫。DateTime值值显现为“/Date(700000+0500)/”情势的JSON字符串,个中第一个数字(在提供的示例中为700000)是GMT时区中自1970年1月1日半夜以来按一般工夫(非夏令时)经由的毫秒数。该数字能够是正数,以暗示之前的工夫。示例中包含“+0500”的部分可选,它唆使该工夫属于Local范例,即它在反序列化时应转换为当地时区。假如没有该部分,则会将工夫反序列化为Utc。
修正Person类,增加LastLoginTime:
1:publicclassPerson
2:{
3:publicstringName{get;set;}
4:publicintAge{get;set;}
5:publicDateTimeLastLoginTime{get;set;}
6:}
1:Personp=newPerson();
2:p.Name="张三";
3:p.Age=28;
4:p.LastLoginTime=DateTime.Now;
5:
6:stringjsonString=JsonHelper.JsonSerializer<Person>(p);
序列化了局:
{"Age":28,"LastLoginTime":"/Date(1294499956278+0800)/","Name":"张三"}
1.在背景利用正则表达式对其交换处置。修正JsonHelper:
1:usingSystem;
2:usingSystem.Collections.Generic;
3:usingSystem.Linq;
4:usingSystem.Web;
5:usingSystem.Runtime.Serialization.Json;
6:usingSystem.IO;
7:usingSystem.Text;
8:usingSystem.Text.RegularExpressions;
9:
10:///<summary>
11:///JSON序列化和反序列化帮助类
12:///</summary>
13:publicclassJsonHelper
14:{
15:///<summary>
16:///JSON序列化
17:///</summary>
18:publicstaticstringJsonSerializer<T>(Tt)
19:{
20:DataContractJsonSerializerser=newDataContractJsonSerializer(typeof(T));
21:MemoryStreamms=newMemoryStream();
22:ser.WriteObject(ms,t);
23:stringjsonString=Encoding.UTF8.GetString(ms.ToArray());
24:ms.Close();
25://交换Json的Date字符串
26:stringp=@"/Date((d+)+d+)/";
27:MatchEvaluatormatchEvaluator=newMatchEvaluator(ConvertJsonDateToDateString);
28:Regexreg=newRegex(p);
29:jsonString=reg.Replace(jsonString,matchEvaluator);
30:returnjsonString;
31:}
32:
33:///<summary>
34:///JSON反序列化
35:///</summary>
36:publicstaticTJsonDeserialize<T>(stringjsonString)
37:{
38://将"yyyy-MM-ddHH:mm:ss"格局的字符串转为"/Date(1294499956278+0800)/"格局
39:stringp=@"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}";
40:MatchEvaluatormatchEvaluator=newMatchEvaluator(ConvertDateStringToJsonDate);
41:Regexreg=newRegex(p);
42:jsonString=reg.Replace(jsonString,matchEvaluator);
43:DataContractJsonSerializerser=newDataContractJsonSerializer(typeof(T));
44:MemoryStreamms=newMemoryStream(Encoding.UTF8.GetBytes(jsonString));
45:Tobj=(T)ser.ReadObject(ms);
46:returnobj;
47:}
48:
49:///<summary>
50:///将Json序列化的工夫由/Date(1294499956278+0800)转为字符串
51:///</summary>
52:privatestaticstringConvertJsonDateToDateString(Matchm)
53:{
54:stringresult=string.Empty;
55:DateTimedt=newDateTime(1970,1,1);
56:dt=dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
57:dt=dt.ToLocalTime();
58:result=dt.ToString("yyyy-MM-ddHH:mm:ss");
59:returnresult;
60:}
61:
62:///<summary>
63:///将工夫字符串转为Json工夫
64:///</summary>
65:privatestaticstringConvertDateStringToJsonDate(Matchm)
66:{
67:stringresult=string.Empty;
68:DateTimedt=DateTime.Parse(m.Groups[0].Value);
69:dt=dt.ToUniversalTime();
70:TimeSpants=dt-DateTime.Parse("1970-01-01");
71:result=string.Format("/Date({0}+0800)/",ts.TotalMilliseconds);
72:returnresult;
73:}
74:}
序列化Demo:
1:Personp=newPerson();
2:p.Name="张三";
3:p.Age=28;
4:p.LastLoginTime=DateTime.Now;
5:
6:stringjsonString=JsonHelper.JsonSerializer<Person>(p);
运转了局:
{"Age":28,"LastLoginTime":"2011-01-0901:00:56","Name":"张三"}
反序列化Demo:
stringjson="{"Age":28,"LastLoginTime":"2011-01-0900:30:00","Name":"张三"}";
p=JsonHelper.JsonDeserialize<Person>(json);
运转了局:
在背景交换字符串合用局限对照窄,假如思索到环球化的有多种言语还会更贫苦。
2.使用JavaScript处置
1:functionChangeDateFormat(jsondate){
2:jsondate=jsondate.replace("/Date(","").replace(")/","");
3:if(jsondate.indexOf("+")>0){
4:jsondate=jsondate.substring(0,jsondate.indexOf("+"));
5:}
6:elseif(jsondate.indexOf("-")>0){
7:jsondate=jsondate.substring(0,jsondate.indexOf("-"));
8:}
9:
10:vardate=newDate(parseInt(jsondate,10));
11:varmonth=date.getMonth()+1<10?"0"+(date.getMonth()+1):date.getMonth()+1;
12:varcurrentDate=date.getDate()<10?"0"+date.getDate():date.getDate();
13:returndate.getFullYear()+"-"+month+"-"+currentDate;
14:}
复杂Demo:
ChangeDateFormat("/Date(1294499956278+0800)/");
了局:
4、JSON序列化和反序列化汇合、字典、数组的处置
在JSON数据中,一切的汇合、字典和数组都暗示为数组。
List<T>序列化:
1:List<Person>list=newList<Person>()
2:{
3:newPerson(){Name="张三",Age=28},
4:newPerson(){Name="李四",Age=25}
5:};
6:
7:stringjsonString=JsonHelper.JsonSerializer<List<Person>>(list);
序列化了局:
"[{"Age":28,"Name":"张三"},{"Age":25,"Name":"李四"}]"
字典不克不及间接用于JSON,Dictionary字典转化为JSON并非跟本来的字典格局分歧,而是情势以Dictionary的Key作为称号”Key“的值,以Dictionary的Value作为称号为”Value“的值。如:
1:Dictionary<string,string>dic=newDictionary<string,string>();
2:dic.Add("Name","张三");
3:dic.Add("Age","28");
4:
5:stringjsonString=JsonHelper.JsonSerializer<Dictionary<string,string>>(dic);
序列化了局:
1:"[{"Key":"Name","Value":"张三"},{"Key":"Age","Value":"28"}]"
博客园
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。
再现理想 该用户已被删除
8#
发表于 2015-3-22 23:10:40 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-22 23:10:40 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
深爱那片海 该用户已被删除
6#
发表于 2015-3-16 13:24:39 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
爱飞 该用户已被删除
5#
发表于 2015-3-8 19:59:12 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
小女巫 该用户已被删除
地板
 楼主| 发表于 2015-2-27 04:23:21 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
再见西城 该用户已被删除
板凳
发表于 2015-2-3 23:33:03 | 只看该作者
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
海妖 该用户已被删除
沙发
发表于 2015-1-25 20:33:44 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
老尸 该用户已被删除
楼主
发表于 2015-1-19 08:04:01 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-11 03:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表