导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。
一、JSON简介
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。
JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。
JSON具有以下的形式:
对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:
var user={"name":"张三","gender":"男","birthday":"1980-8-8"}
数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:
var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}];
字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。
二、对JSON数据进行序列化和反序列化
可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。 DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中。
利用DataContractJsonSerializer序列化和反序列化的代码:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Runtime.Serialization.Json;
6: using System.IO;
7: using System.Text;
8:
9: /// <summary>
10: /// JSON序列化和反序列化辅助类
11: /// </summary>
12: public class JsonHelper
13: {
14: /// <summary>
15: /// JSON序列化
16: /// </summary>
17: public static string JsonSerializer<T>(T t)
18: {
19: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
20: MemoryStream ms = new MemoryStream();
21: ser.WriteObject(ms, t);
22: string jsonString = Encoding.UTF8.GetString(ms.ToArray());
23: ms.Close();
24: return jsonString;
25: }
26:
27: /// <summary>
28: /// JSON反序列化
29: /// </summary>
30: public static T JsonDeserialize<T>(string jsonString)
31: {
32: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
33: MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
34: T obj = (T)ser.ReadObject(ms);
35: return obj;
36: }
37: }
序列化Demo:
简单对象Person:
1: public class Person
2: {
3: public string Name { get; set; }
4: public int Age { get; set; }
5: }
序列化为JSON字符串:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: Person p = new Person();
4: p.Name = "张三";
5: p.Age = 28;
6:
7: string jsonString = JsonHelper.JsonSerializer<Person>(p);
8: Response.Write(jsonString);
9: }
输出结果:
{"Age":28,"Name":"张三"}
反序列化Demo:
1: protected void Page_Load(object sender, EventArgs e)
2: {
3: string jsonString = "{\"Age\":28,\"Name\":\"张三\"}";
4: Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
5: }
运行结果:
ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在 System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用 JSON.NET.
三、JSON序列化和反序列化日期时间的处理
JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提 供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local 类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。
修改Person类,添加LastLoginTime:
1: public class Person
2: {
3: public string Name { get; set; }
4: public int Age { get; set; }
5: public DateTime LastLoginTime { get; set; }
6: }
1: Person p = new Person();
2: p.Name = "张三";
3: p.Age = 28;
4: p.LastLoginTime = DateTime.Now;
5:
6: string jsonString = JsonHelper.JsonSerializer<Person>(p);
序列化结果:
{"Age":28,"LastLoginTime":"\/Date(1294499956278+0800)\/","Name":"张三"}
1. 在后台使用正则表达式对其替换处理。修改JsonHelper:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Runtime.Serialization.Json;
6: using System.IO;
7: using System.Text;
8: using System.Text.RegularExpressions;
9:
10: /// <summary>
11: /// JSON序列化和反序列化辅助类
12: /// </summary>
13: public class JsonHelper
14: {
15: /// <summary>
16: /// JSON序列化
17: /// </summary>
18: public static string JsonSerializer<T>(T t)
19: {
20: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
21: MemoryStream ms = new MemoryStream();
22: ser.WriteObject(ms, t);
23: string jsonString = Encoding.UTF8.GetString(ms.ToArray());
24: ms.Close();
25: //替换Json的Date字符串
26: string p = @"\\/Date\((\d+)\+\d+\)\\/";
27: MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
28: Regex reg = new Regex(p);
29: jsonString = reg.Replace(jsonString, matchEvaluator);
30: return jsonString;
31: }
32:
33: /// <summary>
34: /// JSON反序列化
35: /// </summary>
36: public static T JsonDeserialize<T>(string jsonString)
37: {
38: //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
39: string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
40: MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
41: Regex reg = new Regex(p);
42: jsonString = reg.Replace(jsonString, matchEvaluator);
43: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
44: MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
45: T obj = (T)ser.ReadObject(ms);
46: return obj;
47: }
48:
49: /// <summary>
50: /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
51: /// </summary>
52: private static string ConvertJsonDateToDateString(Match m)
53: {
54: string result = string.Empty;
55: DateTime dt = new DateTime(1970,1,1);
56: dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
57: dt = dt.ToLocalTime();
58: result = dt.ToString("yyyy-MM-dd HH:mm:ss");
59: return result;
60: }
61:
62: /// <summary>
63: /// 将时间字符串转为Json时间
64: /// </summary>
65: private static string ConvertDateStringToJsonDate(Match m)
66: {
67: string result = string.Empty;
68: DateTime dt = DateTime.Parse(m.Groups[0].Value);
69: dt = dt.ToUniversalTime();
70: TimeSpan ts = dt - DateTime.Parse("1970-01-01");
71: result = string.Format("\\/Date({0}+0800)\\/",ts.TotalMilliseconds);
72: return result;
73: }
74: }
序列化Demo:
1: Person p = new Person();
2: p.Name = "张三";
3: p.Age = 28;
4: p.LastLoginTime = DateTime.Now;
5:
6: string jsonString = JsonHelper.JsonSerializer<Person>(p);
运行结果:
{"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}
反序列化Demo:
string json = "{\"Age\":28,\"LastLoginTime\":\"2011-01-09 00:30:00\",\"Name\":\"张三\"}";
p=JsonHelper.JsonDeserialize<Person>(json);
运行结果:
在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。
2. 利用JavaScript处理
1: function ChangeDateFormat(jsondate) {
2: jsondate = jsondate.replace("/Date(", "").replace(")/", "");
3: if (jsondate.indexOf("+") > 0) {
4: jsondate = jsondate.substring(0, jsondate.indexOf("+"));
5: }
6: else if (jsondate.indexOf("-") > 0) {
7: jsondate = jsondate.substring(0, jsondate.indexOf("-"));
8: }
9:
10: var date = new Date(parseInt(jsondate, 10));
11: var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
12: var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
13: return date.getFullYear() + "-" + month + "-" + currentDate;
14: }
简单Demo :
ChangeDateFormat("\/Date(1294499956278+0800)\/");
结果:
四、JSON序列化和反序列化集合、字典、数组的处理
在JSON数据中,所有的集合、字典和数组都表示为数组。
List<T>序列化:
1: List<Person> list = new List<Person>()
2: {
3: new Person(){ Name="张三", Age=28},
4: new Person(){ Name="李四", Age=25}
5: };
6:
7: string jsonString = 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 = new Dictionary<string, string>();
2: dic.Add("Name", "张三");
3: dic.Add("Age", "28");
4:
5: string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);
序列化结果:
1: "[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]"
发表评论
-
GridView 72般绝技
2011-11-19 10:05 848GridView无代码分页排 ... -
ASP.NET 替换字符 防SQL注入
2011-11-19 10:06 901/// <summary> /// 处理字符 ... -
Server.HTMLEncode用法
2011-11-19 10:06 1280Server.HTMLEncode HTML ... -
web.config数据库连接
2011-11-19 10:06 1656Web.Config 配置文件里连接SQL数据库,主要有 ... -
ASP.NET日期处理函数
2011-11-19 10:06 13591、DateTime 数字型 System.DateTi ... -
GridView删除时弹出确认对话框
2011-11-18 11:17 924html代码 <table align=&quo ... -
ASP.NET获取不到js写的cookie解决方法
2011-11-18 11:15 1629今晚使用javascript设置一个来路的cookie, ... -
Net 4.0的UrlRouting实现友好的URL
2011-11-18 11:12 767在.Net 4.0之前我们为了做出搜索引擎友好的,对用户 ... -
ASP.NET Session丢失原因和应对策略
2011-11-18 11:07 852正常操作情况下会有A ... -
TextBox控件
2010-12-20 19:15 778SingleLine—显示单行输入栏. MultiLi ... -
asp.net消息提示框代码
2010-12-20 18:07 1332/// <summary> /// ... -
ASP.NET Request.QueryString[""] 的用法
2010-12-20 01:05 1667Request.QueryString是用来获取参 ... -
检测远程URL是否存在的三种方法
2010-06-07 12:35 794private void Page_Load(object s ... -
ASP.NET4.0 新功能之 ViewStateMode 属性
2010-06-07 12:34 1491ASP.NET4.0 提供了一个叫做 ViewStateMod ... -
ASP.NET 中得到网站绝对路径的几种方法
2010-06-07 12:32 2301在编写 ASP.NET 应用程序的时候,有时为了更好地进行控制 ... -
.net生成静态页面
2010-05-28 14:45 1101模板页moban.htm <html> < ... -
在服务器端使用StringBuilder 对Web控件进行验证
2010-05-28 14:40 880导入命名空间using System.Text; pri ... -
日历控件的事件
2010-05-13 17:07 744 DayRender:当日期被显示时触发该事件。 Sele ... -
判断字符串是否为数字的方法
2010-05-01 12:42 11781﹑使用Try...Catch pri ... -
连接SQL数据库字符串
2010-04-30 22:59 608Data Source=(local);Initial Cat ...
相关推荐
下面将详细介绍***中JSON序列化和反序列化的几种方法以及如何处理日期时间类型的序列化和反序列化。 首先,了解JSON的基本格式是非常重要的。JSON的数据结构由对象(Object)、数组(Array)、字符串(String)、数字...
在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。 一、JSON简介 ...
在.NET开发中,C#语言提供了多种方式来处理JSON序列化和反序列化,这对于数据交换和存储至关重要。本文将详细介绍C#中处理JSON的三种主要方法:使用Json.NET库(Newtonsoft.Json)、使用.NET Framework自带的System....
C#提供了多种序列化技术,包括XML序列化、JSON序列化和BinaryFormatter。 XML序列化可以将对象转换为XML文档,易于人类阅读和机器解析。下面是如何使用`XmlSerializer`进行序列化的例子: ```csharp public class ...
总结来说,ASP.NET中的序列化和反序列化是处理对象状态的重要工具,特别是在存储用户信息、网络通信等方面。通过理解并熟练运用这些技术,开发者能够更好地构建高效、可靠的应用程序。在这个特定的示例中,我们学习...
可以使用`DataContractSerializer`或第三方库如Newtonsoft.Json的`JsonSerializer`实现JSON序列化。 5. **加密与解密**:为了增强安全性,序列化后的数据可能会通过加密算法(如AES)进行加密,然后在反序列化前...
1. **JSON序列化与反序列化**: - **序列化**:将.NET对象转换为JSON字符串,以便通过HTTP发送到客户端。ASP.NET提供了`System.Web.Script.Serialization`命名空间中的`JavaScriptSerializer`类来实现这一过程。...
3. **JavaScriptSerializer**: ASP.NET AJAX中,这个类提供了默认的JSON序列化和反序列化功能。在Json.NET中,虽然也可以使用,但通常推荐使用JsonSerializer,因为它更强大和灵活。 在ASP.NET中使用Json.NET进行...
在ASP.NET中,序列化是一个关键概念,它涉及到将对象的状态转换为可以存储或传输的数据格式,如XML、JSON或二进制。在本案例中,我们将探讨ASP.NET中的Cookie序列化,特别是在Visual Studio 2010环境下。 Cookie是...
/// Json序列化与反序列化方法封装类 /// public static class JsonConvert { /// /// 序列化模型对象为Json /// /// 模型类型 /// 模型对象 /// <returns></returns> public static string GetJson(T...
在.NET框架中,处理JSON序列化和反序列化的工具有很多,其中最常用的包括`Newtonsoft.Json`库(也称为Json.NET)和ASP.NET框架内置的`System.Web.Script.Serialization`命名空间中的`JavaScriptSerializer`类。...
2. JSON序列化:使用Json.NET库(Newtonsoft.Json)或其他.NET Core内置的System.Text.Json,可以将对象转换为JSON字符串。 3. 数据合同(DataContract)序列化:主要用于WCF服务,使用System.Runtime.Serialization...
总的来说,ASP.NET中的JSON处理可以通过多种库实现,如Jayrock.Json和Newtonsoft.Json,它们提供了序列化和反序列化.NET对象为JSON的能力。同时,Visual Studio的插件如“VSJSON插件”可以进一步优化JSON的开发体验...
在 ASP.NET AJAX 中,`JavaScriptSerializer` 类是用于序列化和反序列化对象到 JSON 格式的关键组件。以下是如何使用 `JavaScriptSerializer` 的基本步骤: 1. **序列化对象到 JSON**: 要将 C# 对象转换为 JSON ...
在ASP.NET中,可以使用`System.Web.Script.Serialization`命名空间下的`JavaScriptSerializer`类来实现JSON序列化。例如,将一个C#对象转换为JSON字符串: ```csharp using System.Web.Script.Serialization; ...
使用`DataContractJsonSerializer`类可以方便地实现ASP.NET中的JSON序列化和反序列化。这个类位于`System.Runtime.Serialization.Json`命名空间下。在.NET Framework 3.5中,需要添加对`System.ServiceModel.Web.dll...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以其简洁明了的文本形式,易于...通过分析源码,你可以深入理解JSON解析、序列化和反序列化的过程,以及ASP.NET框架下Web应用的生命周期和工作原理。
4. **JSON序列化**:随着Web应用的发展,JSON因其轻量级和易于阅读的特性,变得越来越流行。.NET框架提供JavaScriptSerializer类,或者可以使用第三方库如Newtonsoft.Json进行JSON序列化。 **四、如何实现序列化?*...