本文转自:http://www.cnblogs.com/songxingzhu/p/3816309.html

直接进入主题:

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 = 10,
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 = 10,
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 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 = 10,
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。因此会损坏原有的日期格式。不过方案二对于其它类型的使用,依然有借鉴之处。还忘不断探索。

[转]JavaScriptSerializer中日期序列化的更多相关文章

  1. JavaScriptSerializer中日期序列化问题解决方案

    JavaScriptSerializer中日期序列化问题解决方案 直接进入主题: class Student { public int age { get; set; } public DateTim ...

  2. JavaScriptSerializer中日期序列化问题

    js请求的json数据返回前台的DateTime 类型被替换成了:\/Date(1404098342309)\/. 这个1404098342309数值,是1970年1月1日(DateTime的最小值) ...

  3. JavaScriptSerializer中日期序列化解决方案

    后台代码: JavaScriptSerializer _jsSerializer = new JavaScriptSerializer(); ViewBag.ProcName = ProcInst.P ...

  4. Net中JSON序列化和反序列化处理(日期时间特殊处理)

    0  缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...

  5. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  6. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  7. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  8. JavaScriptSerializer 中的匿名类型 转json

    二:JavaScriptSerializer 中的匿名类型 这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化 ...

  9. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

随机推荐

  1. Bootstrap 的 Dropdown

    一.简介 Dropdown 就是下拉列表,这里 有一个例子. Dropdown 的完整代码如下: <div id="dropdownWrapper"> <butt ...

  2. C++面试笔记--指针和引用

    面试一:指针与引用的区别? 答案: (1)非空区别.在任何情况下都不能使用指向空值的引用.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针 ...

  3. SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

    题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...

  4. 2013蓝桥杯JavaA组T10 大臣的旅费(树的直径)

    大臣的旅费   时间限制:1.0s   内存限制:256.0MB 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大 ...

  5. PDG科普篇

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2009.09.26 更新历史 2014.11.11补充了文字版PDG的部分内容增加CX PDF等打包格式的相关内容 2009 ...

  6. javascript 文本框值变化触发事件

    javascript 文本框值变化触发事件jo.find(".price").bind('input onpropertychange', function () { me.cal ...

  7. 值得细读!如何系统有效地提升Android代码的安全性?

    众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...

  8. Automake基本用法

    一. 确认你的系统安装有GNU的如下软件: 1. automake2. autoconf3. m44. perl5. 如果你需要产生共享库(shared library)则还需要GNU Libtool ...

  9. 对于vue的一些理解

    首先是组件之间的通信方式 父组件到子组件的通信: props和$refs 子组件到父组件的通信: events 和 $parents 以及 $root 组件之间的通信 eventBus和vuex ev ...

  10. luogu1891 疯狂lcm ??欧拉反演?

    link 给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N). 多组询问,1≤T≤300000,1≤N≤1000000 \(\sum_{i=1}^nlcm(i,n)\) \( ...