Asp.net中Json的序列化和反序列化(二)
三、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)\/");
结果:
2011-1-8
四、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\"}]"
Asp.net中Json的序列化和反序列化(二)的更多相关文章
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...
- ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET中JSON的序列化和反序列化(转)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- [转]ASP.NET中JSON的序列化和反序列化
本文转自:http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html JSON是专门为浏览器中的网页上运行的JavaScript代码 ...
- Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得
在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":&q ...
- ASP.NET MVC Json的序列化和反序列化
1.利用js进行序列化成字符串和反序列化 var personObj = {name:"Tom",age:16}; // 利用JS序列化成字符串 var personStr = J ...
- .NET中JSON的序列化和反序列化的几种方式
一.什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集 ...
- golang中json包序列化与反序列化
package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...
随机推荐
- linux初始化配置---主机名、关闭防火墙、关闭selinux
一.修改主机名 1.零时修改 [root@localhost network-scripts]# hostname jw07 然后就可以看到我们的主机名被修改了
- flash性能优化方案整理(最全)
性能优化的原则 1.避免过早优化:太早优化将使代码难以设计和维护,最好是针对程序的瓶颈进行优化. 2.改进性能有时需要权衡:不能一味注重改进性能,一个项目要考虑各方面的利弊,比如代码的健壮性,结构性, ...
- Spring 定时任务1
转载自 http://blog.csdn.net/prisonbreak_/article/details/49180307 Spring配置文件xmlns加入 xmlns:task="ht ...
- 遗传算法在JobShop中的应用研究(part 2:编码)
编码 在上一篇博客中我们讨论了车间调度问题的编码,具体说就是根据工件的个数和每个工件的工序数来生成12122这样的数字排列,具体的说一个工件包含多少道工序,那么这个工件的编号就出现多少次.从12122 ...
- Linux(centos)的常用基本命令
Linux的常用基本命令. 首先启动Linux.启动完毕后需要进行用户的登录,选择登陆的用户不同自然权限也不一样,其中“系统管理员”拥有最高权限. 在启动Linux后屏幕出现如下界面显示: …… Re ...
- 后勤数据抽取流程图 Logistic Data Extraction
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Windows Internals学习笔记(八)IO系统
参考资料: 1. <Windows Internals> 知识点: ● 当一个进
- Eclipse 修改API
真机调试时报错,提示application api 21,device api 10 Automatic Target Mode: Unable to detect device compatibil ...
- SPI总线(同步)
一.SPI总线简介 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口.SPI 用 于CPU与各种外围器件进行全双工. ...
- Android SharePreference 在主进程和次进程间共享数据不同步出错
SharedPreference作为android五大存储(网络,数据库,文件,SharedPreference,contentProvider)之中最方便使用的一个,从类名上来看就不是一个存储大 ...