|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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跨平台根本就不是外行人想想的那种,一次编译,处处运行。 |
|