JavaScriptSerializer类序列化日期时需要注意的问题
1、让我们来看看使用JavaScriptSerializer类序列化日期会出现什么问题?
1)创建用于序列化的测试类,如下:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime Birthday { get; set; } // 重写ToString方法是为了方便查看结果
public override string ToString()
{
return string.Format("ID:{0};Name:{1};Birthday:{2}", this.ID, this.Name, this.Birthday);
}
}
2)需要引用System.Web.Extensions程序集,因为JavaScriptSerializer类定义于该程序集。编写如下代码进行测试:
Person p = new Person();
p.ID = ;
p.Name = "zhangsan";
p.Birthday = new DateTime(, , , , , );
Console.WriteLine("序列化前的对象:"+p.ToString()); JavaScriptSerializer jss = new JavaScriptSerializer();
string json = jss.Serialize(p);
Console.WriteLine("序列化后的JSON字符串:" + json); Person p2 = jss.Deserialize<Person>(json);
Console.WriteLine("反序列化的对象:"+p2.ToString()); Console.ReadLine();
运行结果如下:
序列化前的对象:ID:1;Name:zhangsan;Birthday:1999/11/11 11:11:11
序列化后的JSON字符串:{"ID":1,"Name":"zhangsan","Birthday":"\/Date(942289871000)\/"}
反序列化的对象:ID:1;Name:zhangsan;Birthday:1999/11/11 3:11:11
从结果中可以看出如下几点问题:
a、序列化前的日期和序列化后的日期不一样,并且相差恰好8小时。
b、Json字符串的日期不是用"yyyy-MM-dd HH:mm:ss"格式表示的。
2、问题分析
1)Json字符串中的日期是怎么表示的?
例如:"\/Date(942289871000+0800)\/",其中第一个数字表示自1970年1月1日午夜到指定日期的毫秒数;"+0800"部分可选,表示时区,默认为UTC。
所以,可以看出,JavaScriptSerializer类将本地时间序列化成的UTC的Json时间字符串,导致反序列化的时间为UTC时间。
在此,可以将反序列化后的时间转换成本地时间验证一下: Console.WriteLine(p2.Birthday.ToLocalTime());
运行结果: 1999/11/11 11:11:11
3、解决方法
1)将"\/Date(942289871000)\/"格式的时间替换成"yyyy-MM-dd HH:mm:ss"格式
代码如下:
/// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// 将Json格式的时间字符串替换为"yyyy-MM-dd HH:mm:ss"格式的字符串
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static string ReplaceJsonDateToDateString(string json)
{
return Regex.Replace(json, @"\\/Date\((\d+)\)\\/", match =>
{
DateTime dt = new DateTime(, , );
dt = dt.AddMilliseconds(long.Parse(match.Groups[].Value));
dt = dt.ToLocalTime();
return dt.ToString("yyyy-MM-dd HH:mm:ss");
});
}
}
Person p = new Person();
p.ID = ;
p.Name = "zhangsan";
p.Birthday = new DateTime(, , , , , );
Console.WriteLine("序列化前的对象:"+p.ToString()); JavaScriptSerializer jss = new JavaScriptSerializer();
string json = jss.Serialize(p);
Console.WriteLine("序列化后的JSON字符串:" + json); json = JsonHelper.ReplaceJsonDateToDateString(json);
Console.WriteLine("替换后的JSON字符串:" + json); Person p2 = jss.Deserialize<Person>(json);
Console.WriteLine("反序列化的对象:"+p2.ToString()); Console.ReadLine();
运行结果:
序列化前的对象:ID:;Name:zhangsan;Birthday://::
序列化后的JSON字符串:{"ID":,"Name":"zhangsan","Birthday":"\/Date(942289871000)\/"}
替换后的JSON字符串:{"ID":,"Name":"zhangsan","Birthday":"1999-11-11 11:11:11"}
反序列化的对象:ID:;Name:zhangsan;Birthday://::
2)使用JsonConvert类进行序列化和反序列化
需要引用Json.NET程序集。代码如下:
Person p = new Person();
p.ID = ;
p.Name = "zhangsan";
p.Birthday = new DateTime(, , , , , );
Console.WriteLine("序列化前的对象:"+p.ToString()); string json = JsonConvert.SerializeObject(p);
Console.WriteLine("序列化后的JSON字符串:" + json); Person p2 = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine("反序列化的对象:"+p2.ToString()); Console.ReadLine();
运行结果:
原对象:ID:;Name:zhangsan;Birthday:// ::
序列化后的JSON字符串:{"ID":,"Name":"zhangsan","Birthday":"1999-11-11T11:11:11"}
反序列化的对象:ID:;Name:zhangsan;Birthday:// ::
JavaScriptSerializer类序列化日期时需要注意的问题的更多相关文章
- 使用JavaScriptSerializer进行序列化日期类型应该注意的问题
原文:使用JavaScriptSerializer进行序列化日期类型应该注意的问题 JavaScriptSerializer在序列化DateTime时,是用刻度来表示的,具体在Json体现为:\/Da ...
- 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...
- .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
"/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...
- C#中使用JavaScriptSerializer类实现序列化与反序列化
1.添加引用 JavaScriptSerializer类的使用需要引用System.Web.Extensions.dll文件,根据路径:C:\Program Files (x86)\Reference ...
- 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错
如题 报错提示: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值.","Sta ...
- MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错
MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...
- JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string u ...
随机推荐
- 内部类访问外部类方法中的参数-使用final
public synchronized <T extends MetricsSource> T register(final String name, final String desc, ...
- javascript之创建对象的方式
1.object构造函数创建 var obj=new Object(); obj.name='xue'; 2.对象字面量创建 var obj={ name:'xue' } 3.构造函数创建 funct ...
- 各个国家 不同字符集的unicode 编码范围
原文地址:http://blog.csdn.NET/xzl04/article/details/6307416 0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic ...
- Docker 与 宿主机之间的文件cp
Docker 与 宿主机之间的文件cp 第一种方法是官方比较推荐的,其实和第二种方法实现是一样的. 第一种方法例: 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下. ...
- Visual Studio Ultimate 2013 下载地址
VS2013_RTM_ULT_CHS.iso 文件大小:2.87G 百度网盘下载地址: http://pan.baidu.com/s/1bn4gavX 微软官网下载地址: http://downloa ...
- excel,word,ppt,pdf,swf 文件互相转换
转自: http://www.cnblogs.com/wolf-sun/p/3569960.html 引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案 ...
- SQL Server 盛宴系列 webcast
数据库学习站点,示例,视频 http://technet.microsoft.com/zh-cn/dd722671.aspx
- C++ TUTORIAL - MEMORY ALLOCATION - 2016
http://www.bogotobogo.com/cplusplus/memoryallocation.php Variables and Memory Variables represent st ...
- eclispe的使用
1.eclipse 有的时候,子类包都已经写了,这时候要添加一个父类包,如果在包结构下是添加不了的,这时候需要切换格式:
- Laravel中使用模型对数据进行操作
public function orm(){ //查询表的所有记录 //$user = Admin::all(); //dd($user); //查询某一条记录 //$user = Admin::fi ...