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语法规则 ...
随机推荐
- python 反模式
不使用 pythonic 的循环: l = [1,2,3] #Bad for i in range(0,len(list)): le = l[i] print(i,le) #Good for i,le ...
- 系分过了,mark一下,就从这里开始吧
算是重新归回吧,发现写博客还是这里人气比较旺,开源中国不行,动弹人气还可以,不过都没啥节操, 这么多年没来了,发现竟然还排名1150,不容易,继续加油.有种回娘家的赶脚
- Object C学习笔记25-文件管理(一)
在此篇文章中简单记录一下文件管理,在Object C中NSFileManager用于管理文件已经路径.在Object C中的文件路径可以是相对路径也可以是绝对路径.斜线“/”开头,斜线实际上就是一个目 ...
- [工具类]将时间转换为unix时间戳格式
写在前面 由于在数据库中存的时间有时间戳格式的数据,在解析以及保存的时候,就需要考虑到数据格式的兼容性问题.看到数据库中的时间字段基本上都是以时间戳格式存储的,没办法,只能将时间进行转换了,考虑到其他 ...
- 第二十一课:js属性操作的兼容性问题
上一课主要讲了属性的概念,用法,固有属性和自定义属性的区别,class属性操作的方法等,这一课主要讲一些有关属性操作的兼容性问题. IE6-IE8在一些表示URL的属性会返回补全的改过编码的路径,比如 ...
- setter方法的内存错误
- (void)setList:(ClassicList *)list { self.list = list; _titleLabel.text = list.activityName; _addre ...
- mysqldump使用方法
1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql (2)导出数据库结构 ...
- sersync + rsync 实现文件的实时同步
这里有一点要特别注意了,就是在你完成备份之后,先不要把本地的文件都给删除了,先把服务停了之后再删除文件, 因为你已删除,检查到两边不一致,他又会把备份端给删除了.所以特别得注意了.这里吃过一次亏. 还 ...
- VS中两个常用辅助工具
一. 首当推荐的是DPack 下载地址:http://www.usysware.com/dpack/ 快捷键:以下都是个人常用的热键.其他还有,我都用得比较少了,3个已经完全够了 Alt+U 查找 ...
- 幻灯片插件FlexSlider -- Amaze UI幻灯片参数
用了Amaze UI 的人就知道,其幻灯片插件是 data-am-slider='{}'来传参数的:(以下代码来自Amaze UI 官网) <div data-am-widget="s ...