首页 >后端开发 >C#.Net教程 >ASP.NET中JSON的序列化和反序列化

ASP.NET中JSON的序列化和反序列化

巴扎黑
巴扎黑原创
2016-12-20 09:12:561338浏览

导读:JSON是专门为浏览器中的网页上运行的JavaScript的代码而设计的一种数据格式在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间,集合,字典的处理。

一,JSON简介

JSON(JavaScript对象符号,JavaScript的对象表示法)是一种轻量级的数据交换格式。

JSON是“名值对”的集合结构由大括号“{}”中括号“[]”,逗号“,”,冒号。“:”双引号'“,”'组成,包含的数据类型有对象,数字,布尔值,字符串数组,NULL等。

JSON具有以下的形式:

对象(对象)是一个无序的“名值对”集合,一个对象以“{”开始,“}”结束每个“名”后跟着一个“:”,多个“名值对”由逗号分隔如:

VAR用户= {“名”:“张三”,“性别”:“男”,“生日”:“1980年8月8日”}

数组(阵列)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔如:

VAR用户列表= [{“用户”:{“名”:“张三”,“性别”:“男”,“生日”:“1980年8月8日”}},{“用户”:{“名” “李四”,“性别”:“男”,“生日”:“1985年5月8日”}}];

字符串(字符串)是由双引号包围的任意数量的的Unicode字符的集合,使用反斜线转义。

二,对JSON数据进行序列化和反序列化

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5的包含在System.ServiceModel.Web .dll文件中,需要添加对其的引用; .NET框架4在System.Runtime.Serialization中。

利用DataContractJsonSerializer序列化和反序列化的代码:

   1:使用系统;

   2:使用System.Collections.Generic;

   3:使用System.Linq的;

   4:使用的System.Web;

   5:使用System.Runtime.Serialization.Json;

   6:使用System.IO;

   7:使用System.Text;

   8: 

   9:/// <摘要>

  10:/// JSON序列化和反序列化辅助类

  11:///

  12:公共类JsonHelper

  13:{

  14:/// <摘要>

  15:/// JSON序列化

  16:///

  17:公共静态字符串JsonSerializer (T T)

  18:{

  19:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  20:MemoryStream的毫秒=新的MemoryStream();

  21:ser.WriteObject(MS,T);

  22:字符串jsonString = Encoding.UTF8.GetString(ms.ToArray());

  23:ms.Close();

  24:返回jsonString;

  25:}

  26: 

  27:/// <摘要>

  28:/// JSON反序列化

  29:///

  30:公共静态牛逼JsonDeserialize (串jsonString)

  31:{

  32:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  33:MemoryStream的毫秒=新的MemoryStream(Encoding.UTF8.GetBytes(jsonString));

  34:T已OBJ =(T)ser.ReadObject(MS);

  35:返回OBJ;

  36:}

  37:}

序列化演示:

简单对象的人:

   1:公共类Person

   2:{

   3:公共字符串名称{; 组; }

   4:公众诠释年龄{搞定; 组; }

   5:}

序列化为JSON字符串:

   1:保护无效的Page_Load(对象发件人,EventArgs的发送)

   2:{

   3:人p =新的Person();

   4:p.Name =“张三”;

   5:p.Age = 28;

   6: 

   7:字符串jsonString = JsonHelper.JsonSerializer <人>(P);

   8:回复于(jsonString);

   9:}

输出结果:

{“时代”:28日,“名”:“张三”}

反序列化演示:

   1:保护无效的Page_Load(对象发件人,EventArgs的发送)

   2:{

   3:字符串jsonString =“{\”年龄\“:28日,\”名称\“:\”张三\“}”;

   4人P = JsonHelper.JsonDeserialize <人>(jsonString);

   5:}

运行结果:

ASP.NET中的JSON序列化和反序列化还可以使用的JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll。也可以使用JSON.NET。

三,JSON序列化和反序列化日期时间的处理

JSON格式不直接支持日期和时间.DateTime值值显示为“/日期(700000 + 0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为700000)是GMT时区中自1970年1月1日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“0500”的部分可选,它指示该时间属于当地类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为UTC。

修改个人类,添加LastLoginTime:

   1:公共类Person

   2:{

   3:公共字符串名称{; 组; }

   4:公众诠释年龄{搞定; 组; }

   5:公共的DateTime LastLoginTime {搞定; 组; }

   6:}

   1:人p =新的Person();

   2:p.Name =“张三”;

   3:p.Age = 28;

   4:p.LastLoginTime = DateTime.Now;

   5: 

   6:字符串jsonString = JsonHelper.JsonSerializer <人>(P);

序列化结果:

{“时代”:28日,“LastLoginTime”:“\ /日期(1294499956278 + 0800)\ /”,“姓名”:“张三”}

1.在后台使用正则表达式对其替换处理修改JsonHelper:

   1:使用系统;

   2:使用System.Collections.Generic;

   3:使用System.Linq的;

   4:使用的System.Web;

   5:使用System.Runtime.Serialization.Json;

   6:使用System.IO;

   7:使用System.Text;

   8:使用System.Text.RegularExpressions;

   9: 

  10:/// <摘要>

  11:/// JSON序列化和反序列化辅助类

  12:///

  13:公共类JsonHelper

  14:{

  15:/// <摘要>

  16:/// JSON序列化

  17:///

  18:公共静态字符串JsonSerializer (T T)

  19:{

  20:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  21:MemoryStream的毫秒=新的MemoryStream();

  22:ser.WriteObject(MS,T);

  23:字符串jsonString = Encoding.UTF8.GetString(ms.ToArray());

  24:ms.Close();

  25://替换的Json的日期字符串

  26:串P = @“ \\ /日期\((\ D +)\ + \ D + \)\\ / ”;

  27:MatchEvaluator matchEvaluator =新MatchEvaluator(ConvertJsonDateToDateString);

  28:正则表达式章=新的正则表达式(P);

  29:jsonString = reg.Replace(jsonString,matchEvaluator);

  30:返回jsonString;

  31:}

  32: 

  33:/// <摘要>

  34:/// JSON反序列化

  35:///

  36:公共静态牛逼JsonDeserialize (串jsonString)

  37:{

  38://将“YYYY-MM-DD HH:MM:SS”格式的字符串转为“\ /日期(1294499956278 + 0800)\ /”格式

  39:串P = @“\ D {4} - \ d {2} - \ d {2} \ S \ D {2}:\ D {2}:\ D {2}”;

  40:MatchEvaluator matchEvaluator =新MatchEvaluator(ConvertDateStringToJsonDate);

  41:正则表达式章=新的正则表达式(P);

  42:jsonString = reg.Replace(jsonString,matchEvaluator);

  43:DataContractJsonSerializer SER =新DataContractJsonSerializer(typeof运算(T));

  44:MemoryStream的毫秒=新的MemoryStream(Encoding.UTF8.GetBytes(jsonString));

  45:T已OBJ =(T)ser.ReadObject(MS);

  46:返回OBJ;

  47:}

  48: 

  49:/// <摘要>

  50:///将Json的序列化的时间由/日期(1294499956278 + 0800)转为字符串

  51:///

  52:私人静态字符串ConvertJsonDateToDateString(赛米)

  53:{

  54:字符串结果=的String.Empty;

  55:DateTime的DT =新日期时间(1970,1,1);

  56:DT = dt.AddMilliseconds(long.Parse(m.Groups [1] .value的));

  57:DT = dt.ToLocalTime();

  58:结果= dt.ToString(“YYYY-MM-DD HH:MM:SS”);

  59:返回结果;

  60:}

  61: 

  62:/// <摘要>

  63:///将时间字符串转为Json的时间

  64:///

  65:私人静态字符串ConvertDateStringToJsonDate(赛米)

  66:{

  67:字符串结果=的String.Empty;

  68:DateTime的DT = DateTime.Parse(m.Groups [0] .value的);

  69:DT = dt.ToUniversalTime();

  70:时间跨度TS = DT - DateTime.Parse(“1970-01-01”);

  71:结果=的String.Format(“ \\ /日期({0} +0800)\\ /”,ts.TotalMilliseconds);

  72:返回结果;

  73:}

  74:}

序列化演示:

   1:人p =新的Person();

   2:p.Name =“张三”;

   3:p.Age = 28;

   4:p.LastLoginTime = DateTime.Now;

   5: 

   6:字符串jsonString = JsonHelper.JsonSerializer <人>(P);

运行结果:

{“时代”:28日,“LastLoginTime”:“2011-01-09一点○○分56秒”,“姓名”:“张三”}

反序列化演示:

JSON字符串=“{\”年龄\“:28日,\”LastLoginTime \“:\”2011-01-09 00:30:00 \“,\”名称\“:\”张三\“}”;

P = JsonHelper.JsonDeserialize <人>(JSON);

运行结果:

在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

2.利用JavaScript的处理

   1:功能ChangeDateFormat(jsondate){

   2:jsondate = jsondate.replace(“/日期(”,“”).replace(“)/”,“”);

   3:如果(jsondate.indexOf(“+”)> 0){

   4:jsondate = jsondate.substring(0,jsondate.indexOf(“+”));

   5:}

   6:否则如果(jsondate.indexOf(“ - ”)> 0){

   7:jsondate = jsondate.substring(0,jsondate.indexOf(“ - ”));

   8:}

   9: 

  10:VAR日期=新的日期(parseInt函数(jsondate,10));

  11:无功一个月= date.getMonth()+ 1 <10?“0”+(date.getMonth()+ 1):date.getMonth()+ 1;

  12:VAR的currentdate = date.getDate()<10?“0”+ date.getDate():date.getDate();

  13:返回date.getFullYear()+“ - ”+月+“ - ”+的currentdate;

  14:}

简单演示:

ChangeDateFormat(“\ /日期(1294499956278 + 0800)\ /”);

结果:

四,JSON序列化和反序列化集合,字典,数组的处理

在JSON数据中,所有的集合,字典和数组都表示为数组。

名单序列化:

   1:名单<人>列表=新的List <人>()

   2:{

   3:新的Person(){名称=“张三”,年龄= 28},

   4:新的Person(){名称=“李四”,年龄= 25}

   5:};

   6: 

   7:字符串jsonString = JsonHelper.JsonSerializer <名单<人>>(名单);

序列化结果:

“[{\”年龄\“:28日,\”名称\“:\”张三\“},{\”年龄\“:25,\”名称\“:\”李四\“}]”

字典不能直接用于JSON,字典字典转化为JSON并不是跟原来的字典格式一致,而是形式以词典的按键作为名称“密钥”的值,以字典的值作为名称为“值”的值。如:

   1:词典<字符串,字符串> DIC =新词典<字符串,字符串>();

   2:dic.Add(“姓名”,“张三”);

   3:dic.Add(“时代”,“28”);

   4: 

   5:字符串jsonString = JsonHelper.JsonSerializer <词典<字符串,字符串>>(DIC);

序列化结果:

   1:“[{\”键\“:\”名称\“,\”价值\“:\”张三\“},{\”键\“:\”年龄\“,\”价值\“: \“28 \”}]“


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn