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. C++中map容器的说明和使用技巧

    C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 一.map的说明 1 头文件 #include <map> 2 定义 ma ...

  2. 渲染树render tree

    CSSOM树和DOM树连接在一起形成一个render tree,渲染树用来计算可见元素的布局并且作为将像素渲染到屏幕上的过程的输入. DOM树和CSSOM树连接在一起形成render tree . r ...

  3. 使用openssl的aes各种加密算法

    #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/sta ...

  4. [SHOI 2017] 寿司餐厅

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4873 [算法] 注意到题目中的限制条件可表述为 : 若选择区间[L , R] , 则 ...

  5. P2759 奇怪的函数

    题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x 输入输出样例 输入样例# ...

  6. 深度学习之卷积神经网络(CNN)学习

    1.卷积神经网络中卷积的核心意义是什么?每一组卷集核 权重是一个抽特征的滤波器, 从卷集核的角度抽取特征 2.卷积神经网络很好的特性参数共享机制每一个神经元固定一组a x b x c(图像的通道数) ...

  7. phpstudy打不开localhost(Apache)

    1.先打开httpd.conf文件,打开httpd-vhosts.conf "Include conf/extra/httpd-vhosts.conf"的注释,启动服务时优先加载此 ...

  8. vscode实现列编辑

    ctrl + shift + 左键选择要编辑的列 好用,再也不用使用\n替换了

  9. maven构建java项目、web项目

    maven构建java项目.web项目 一.mvn构建web项目 1安装mvn(包括path) 2命令:mvn archetype:create -DgroupId=cn.edu.sdau.neat ...

  10. Git小白到老鸟的进阶之路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,师兄,上次你教我的操作,我傻乎乎的执行了一遍,可是那个Git究竟是什么那? 师兄:小白莫慌,Git就是一种版本控制,小 ...