[转]JavaScriptSerializer中日期序列化

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

时间: 2024-10-31 06:28:00

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

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.Serializat

JavaScriptSerializer中日期序列化问题

js请求的json数据返回前台的DateTime 类型被替换成了:\/Date(1404098342309)\/. 这个1404098342309数值,是1970年1月1日(DateTime的最小值)到date实际表示的日期之差的总毫秒数. 解决方法: str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match => { DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMill

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

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

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

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

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

json序列化和反序列化帮助类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.IO; using System.Text.RegularExpressions; using System.We

DB2 中日期 比较

在DB2中的Date 一共识别三种格式,最常见的是这样 '2013-12-12' 对,你没看错,DB2认为这样的字符串就是Date数据 然后我们可以利用函数这样寻找日期区间 select * from users where g_time between '2003-05-04 ' and '2003-05-08' 也可以利用操作符来进行常规的日期大小比较 select * from users where g_time >= '2003-05-04 ' 这篇文档更加详细http://www.c

用简单的方法实现js中日期的加减法

今天就算对JS中日期的加减法做个总结,一共两步 第一步,引入date.format.js,这个JS的作用是将日期转为指定的格式,代码如下 var dateFormat = function () {     var    token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,         timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mount

Java中日期类型和mysql中日期类型进行整合

1. java与mysql中日期.时间类型总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59 timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到2038 date 3bytes xxxx-x

转换 数据库中日期(/Date(1351699200000)/) 的格式

转换 数据库中日期(/Date(1351699200000)/) 的格式: C#中转换日期格式 var date=com.CREATEDATETIME.ToString(); JavaScript中转换日期格式 //转日期: function getDateStr(dateDB) { //传数据库中日期 var numStr = dateDB.replace(/[^0-9]/g, ''); var num = parseInt(numStr); var strDate = new Date(nu