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类序列化日期时需要注意的问题的更多相关文章

  1. 使用JavaScriptSerializer进行序列化日期类型应该注意的问题

    原文:使用JavaScriptSerializer进行序列化日期类型应该注意的问题 JavaScriptSerializer在序列化DateTime时,是用刻度来表示的,具体在Json体现为:\/Da ...

  2. 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化

    1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...

  3. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  4. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  5. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

  6. C#中使用JavaScriptSerializer类实现序列化与反序列化

    1.添加引用 JavaScriptSerializer类的使用需要引用System.Web.Extensions.dll文件,根据路径:C:\Program Files (x86)\Reference ...

  7. 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错

    如题 报错提示: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值.","Sta ...

  8. MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错

    MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data =&qu ...

  9. JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写:   [HttpPost]   public JsonResult QueryFeature(string u ...

随机推荐

  1. 内部类访问外部类方法中的参数-使用final

    public synchronized <T extends MetricsSource> T register(final String name, final String desc, ...

  2. javascript之创建对象的方式

    1.object构造函数创建 var obj=new Object(); obj.name='xue'; 2.对象字面量创建 var obj={ name:'xue' } 3.构造函数创建 funct ...

  3. 各个国家 不同字符集的unicode 编码范围

    原文地址:http://blog.csdn.NET/xzl04/article/details/6307416 0000-007F:C0控制符及基本拉丁文 (C0 Control and Basic  ...

  4. Docker 与 宿主机之间的文件cp

    Docker 与 宿主机之间的文件cp 第一种方法是官方比较推荐的,其实和第二种方法实现是一样的. 第一种方法例: 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下. ...

  5. Visual Studio Ultimate 2013 下载地址

    VS2013_RTM_ULT_CHS.iso 文件大小:2.87G 百度网盘下载地址: http://pan.baidu.com/s/1bn4gavX 微软官网下载地址: http://downloa ...

  6. excel,word,ppt,pdf,swf 文件互相转换

    转自:  http://www.cnblogs.com/wolf-sun/p/3569960.html 引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案 ...

  7. SQL Server 盛宴系列 webcast

    数据库学习站点,示例,视频 http://technet.microsoft.com/zh-cn/dd722671.aspx

  8. C++ TUTORIAL - MEMORY ALLOCATION - 2016

    http://www.bogotobogo.com/cplusplus/memoryallocation.php Variables and Memory Variables represent st ...

  9. eclispe的使用

    1.eclipse 有的时候,子类包都已经写了,这时候要添加一个父类包,如果在包结构下是添加不了的,这时候需要切换格式:    

  10. Laravel中使用模型对数据进行操作

    public function orm(){ //查询表的所有记录 //$user = Admin::all(); //dd($user); //查询某一条记录 //$user = Admin::fi ...