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 ...
随机推荐
- CSS实现文字内容不被截断当超出指定长度时该字符串自动整体换到下一行
效果图: 1.内容不被截断 span { overflow:hidden; white-space:nowrap; text-overflow:ellipsis; ...
- CentOS环境 升级Python2.6.6至2.7.5
1.查看当前Python版本 # python -V Python 2.6.6 # python -V Python 2.6.6 2.下载Python2.7.5源码 # wget http://p ...
- JVM介绍(一)
JVM是运行在操作系统之上的,它与硬件没有直接的交互 类装载器ClassLoader 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的 ...
- bzoj 4589 Hard Nim —— FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 先手必败,是一开始所有石子的异或和为0: 生成函数 (xpri[1] + xpri[2 ...
- poj2728 Desert King——01分数规划
题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: ...
- mfc为对话框添加启动画面
新建CwzdSplash类 CwzdSplash.h #pragma once class CWzdSplash : public CWnd { DECLARE_DYNAMIC(CWzdSplash) ...
- mysql慢日志记录
DBA工作:通过日志找到执行慢的sql语句 慢日志: - 执行时间 > 10 - 未命中索引 配置: - 基于内存 show variables like '%query%'; set glob ...
- Eclipse中建立自己的类库,给不同的工程使用
win7 进入服务 开始 运行 services.msc 在多个工程当中,可能使用到相同的jar包,这时,如果我们建立一个自己的类库,该类库中存放着所有工程均需要的jar包,就可以免去重复导入的麻烦. ...
- CCF 201509-3 模板生成系统 (STL+模拟)
问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerr ...
- Tomcat注入到系统服务中,实现服务自启动及常驻
步骤一.打开service.bat 并修改(推荐notepad++): 1.set SERVICE_NAME=Tomcat6(服务名称,可在命令行中通过该名字进行服务的控制(启动/关闭)) 2.se ...