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 ...
随机推荐
- linux系统配置之bash shell的配置(centos)
linux系统开机启动过程的最后阶段会由init进程根据启动方案(运行级:0-6)启动许多基本的服务程序,为用户提供各种各样的服务.在启动这些服务的最后会启动一个为用户提供操作环境的服务,用户就是通过 ...
- DGA域名——可以每天只生成一个域名,因此最多存在365个 DGA域名;
Mirai变种中的DGA 分享到: 发布时间:2016-12-12 16:02:57 作者:360网络安全研究院 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 那个导致美国断网 ...
- Java面向对象的三大特征详解
一.封装(Encapsulation) 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保 ...
- Android自动化测试怎么填写Xpath
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5sAAAJYCAIAAABjAmXpAAAgAElEQVR4nOzdeZhb5Z0veNV/M88sz7 ...
- ACM应该学什么(知乎学长)
网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法,自己靠动脑筋能够实现的),这种题目特点是麻烦,但是不难, ...
- {{badmatch, {error, eexist}}
今天在编译cowboy工程在resolve release build时提示编译错误:{{badmatch, {error, eexist}} 后经调查可能是因为rebar的bug导致的,可是删除_b ...
- MongoDB复制集高可用选举机制(三)
复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...
- npm --- Node.js包管理器
目录 1. 安装Node.js 2. 运行npm 3. npm介绍 3.1 安装插件 3.2 更新插件 3.3 卸载插件 3.4 查看当前目录中的插件列表 4. 使用cnpm 4.1 安装 npm( ...
- json数组对象和对象数组 ---OK
一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...
- Java: JavaMail 初试(一)
前言:以前的我,很喜欢写东西,写一写所想所见所闻所感,但是工作之后,总不能写出让自己满意的文章,突发奇想,能否利用写博客的时机,将其写成类似散文似的博文呢?哈哈... 邮件功能尝试:作为一个小菜鸟,对 ...