JavaScriptSerializer中日期序列化问题解决方案
JavaScriptSerializer中日期序列化问题解决方案
直接进入主题:
class Student
{
public int age { get; set; }
public DateTime? date { get; set; }
public string name { get; set; }
}
当点击的时候:
private void button1_Click(object sender, EventArgs e)
{
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Student> list = new List<Student>();
list.Add(new Student()
{
age = ,
date = DateTime.Now,
name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
});
//js.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
var str = js.Serialize(list);
//str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
//{
// DateTime dt = new DateTime(1970, 1, 1);
// dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
// dt = dt.ToLocalTime();
// return dt.ToString("yyyy-MM-dd HH:mm:ss");
//});
//var obj = js.Deserialize<List<Student>>(str);
textBox1.Text = str;
}
这个时候,显示如下内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
显然,这里的DateTime 类型被替换成了:\/Date(1404098342309)\/,经过分析,其实这个1404098342309数值,是1970年1月1日(DateTime的最小值)到date实际表示的日期之差的总毫秒数。
因此,这里提供2种解决方案。
方案1 :
private void button1_Click(object sender, EventArgs e)
{
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Student> list = new List<Student>();
list.Add(new Student()
{
age = ,
date = DateTime.Now,
name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
});
//js.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
var str = js.Serialize(list);
str = Regex.Replace(str, @"\\/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");
});
//var obj = js.Deserialize<List<Student>>(str);
textBox1.Text = str;
}
显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
当取消var obj = js.Deserialize<List<Student>>(str);的注释之后,会发现反序列化也完全正常。因此,这算是当前的最佳方案。
方案2 :
如果用户的日期需求中,只用到年月日,无需时分秒的情况下:如,2014-06-30 时,可以使用如下方案:
public class DateTimeConverter : JavaScriptConverter
{ public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{ return new JavaScriptSerializer().ConvertToType(dictionary, type); } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{ if (!(obj is DateTime)) return null;
return new CustomString(((DateTime)obj).ToString("yyyy-MM-dd"));
} public override IEnumerable<Type> SupportedTypes
{ get
{
return new[] { typeof(DateTime) };
} } private class CustomString : Uri, IDictionary<string, object>
{
public CustomString(string str)
: base(str, UriKind.Relative)
{ } void IDictionary<string, object>.Add(string key, object value)
{ throw new NotImplementedException(); } bool IDictionary<string, object>.ContainsKey(string key)
{ throw new NotImplementedException(); } ICollection<string> IDictionary<string, object>.Keys
{ get
{
throw new NotImplementedException();
} } bool IDictionary<string, object>.Remove(string key)
{ throw new NotImplementedException(); } bool IDictionary<string, object>.TryGetValue(string key, out object value)
{ throw new NotImplementedException(); } ICollection<object> IDictionary<string, object>.Values
{ get
{
throw new NotImplementedException();
} } object IDictionary<string, object>.this[string key]
{ get
{ throw new NotImplementedException(); } set
{ throw new NotImplementedException(); } } void ICollection<KeyValuePair<string, object>>.Add(KeyValuePair<string, object> item)
{ throw new NotImplementedException(); } void ICollection<KeyValuePair<string, object>>.Clear()
{ throw new NotImplementedException(); } bool ICollection<KeyValuePair<string, object>>.Contains(KeyValuePair<string, object> item)
{ throw new NotImplementedException(); } void ICollection<KeyValuePair<string, object>>.CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
{ throw new NotImplementedException(); } int ICollection<KeyValuePair<string, object>>.Count
{ get
{
throw new NotImplementedException();
} } bool ICollection<KeyValuePair<string, object>>.IsReadOnly
{ get
{
throw new NotImplementedException();
} } bool ICollection<KeyValuePair<string, object>>.Remove(KeyValuePair<string, object> item)
{ throw new NotImplementedException(); } IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator()
{
throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException(); } }
点击按钮时,注册即可:
private void button1_Click(object sender, EventArgs e)
{
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Student> list = new List<Student>();
list.Add(new Student()
{
age = ,
date = DateTime.Now,
name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
});
js.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
var str = js.Serialize(list);
//str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
//{
// DateTime dt = new DateTime(1970, 1, 1);
// dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
// dt = dt.ToLocalTime();
// return dt.ToString("yyyy-MM-dd HH:mm:ss");
//});
//var obj = js.Deserialize<List<Student>>(str);
textBox1.Text = str;
}
执行效果如下:[{"age":10,"date":"2014-06-30","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
对于方案二来说,由于内部使用的是Uri类,因此,将日期转为字符串如:2014-06-30 11:30:00这 种样式的时候,中间的空格,会被进行Url编码:空格会被编码成:%20。因此会损坏原有的日期格式。不过方案二对于其它类型的使用,依然有借鉴之处。还忘不断探索。
------------------- 繁星小宋:宋兴柱(Sindrol)于2014-06-30:11:31分
JavaScriptSerializer中日期序列化问题解决方案的更多相关文章
- JavaScriptSerializer中日期序列化解决方案
后台代码: JavaScriptSerializer _jsSerializer = new JavaScriptSerializer(); ViewBag.ProcName = ProcInst.P ...
- [转]JavaScriptSerializer中日期序列化
本文转自:http://www.cnblogs.com/songxingzhu/p/3816309.html 直接进入主题: class Student { public int age { get; ...
- JavaScriptSerializer中日期序列化问题
js请求的json数据返回前台的DateTime 类型被替换成了:\/Date(1404098342309)\/. 这个1404098342309数值,是1970年1月1日(DateTime的最小值) ...
- 关于web api 中 日期格式问题解决方案
在构造函数或者 全局开始的时候调用这个 public BossApiController() { JsonMediaTypeFormatter jsonFormatter = GlobalConfig ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 在net中json序列化与反序列化
准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则: 数据在键值对中 数据由逗号分隔 花括 ...
- Json.net说法——(一)修饰标签,日期序列化
摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
随机推荐
- [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
11.2 Write a method to sort an array of strings so that all the anagrams are next to each other. 这道题 ...
- 招聘一个靠谱的ios
1. 风格纠错题 修改方法有很多种,现给出一种做示例: 最终改为: 下面对具体修改的地方, 2. 什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 1 ...
- ASP.NET MVC 5 入门教程 (3) 路由route
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-route.html 上一节:ASP.NET MVC 5 入门 ...
- 利用location.hash+iframe跨域获取数据详解
前言 如果看懂了前文利用window.name+iframe跨域获取数据,那么此文也就很好理解了.一样都是动态插入一个iframe,然后把iframe的src指向服务端地址,而服务端同样都是输出一段j ...
- 02.C#可空類型、默認參數、LINQ(一章1.3-1.4)
利用上班時間發個隨筆,不知領導會不會看到,可能會有同事看到也說不定啊:) 關于可空類型,在C#1中沒有這個概念,在C#3中引入的.那比如我們要實現一個表示人的類,人有名字和年齡兩個屬性,如何表示一個沒 ...
- java 获取主机IP
public class Chat extends JFrame { public static JTextField jt; public Chat(){ setLayout(new FlowLay ...
- 每天一个linux命令(17):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- Spring aop的实现原理
简介 前段时间写的java设计模式--代理模式,最近在看Spring Aop的时候,觉得于代理模式应该有密切的联系,于是决定了解下Spring Aop的实现原理. 说起AOP就不得不说下OOP了,OO ...
- ORA-12737: Instant Client Light: unsupported server character set CHS16GBK/ZHS16GBK解决方案
二.Navicat for Oracle的配置 1.启动该工具,出现如下的开始界面,单击“连接”选项,进行连接数据库,如图所示: 6.在“新建连接”对话框中,输入任意的连接名,选择默认的连接类型,输入 ...
- Hibernate-一对多的关系维护
一对多 和多对一 一般是看需求来确定的,很多时候都是设置成双向的 举个最最普通的离子 :一个班级里面有多个学生 多个学生属于一个班级 从学生表来看 就是多对一的关系 从班级表来看就是一对多的关系 需求 ...