Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 22596|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 773 天

    [LV.10]以坛为家III

    2045

    主题

    2103

    帖子

    71万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    713646
    发表于 2021-4-15 17:43:45 | 显示全部楼层 |阅读模式

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

     

     

    ------------------- 繁星小宋:宋兴柱(Sindrol)于2014-06-30:11:31分

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-8-13 13:24 , Processed in 0.062359 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表