[转载]自定义json日期序列化 - ^乔乔^ - 博客园

[转载]自定义json日期序列化 – ^乔乔^ – 博客园.

C#的datetime 序列化为日期特别恶心,因为JavaScriptSerializer方法序列化出来是\/Date(****)\/以前都是在JS上再用正则处理,所以总会在用JSON的时候特别不顺手。所以今天折腾了一下序列化方法。

public class DateTimeConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            if (string.IsNullOrEmpty(dictionary["Value"].ToString()) || type != typeof(DateTime?))
                return null;
            if (string.IsNullOrEmpty(dictionary["Value"].ToString()) || type != typeof(DateTime))
                return DateTime.MinValue;
            string dateString = dictionary["Value"].ToString().Replace("new Date(", "").Replace(")", "");
            string[] spli = dateString.Split(',');
            return DateTime.Parse(string.Format("{0}-{1}-{2} {3}:{4}:{5}", spli[0], spli[1], spli[2], spli[3], spli[4], spli[5]));
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            IDictionary<string, object> result = new Dictionary<string, object>();
            if (obj == null)
                result["Value"] = string.Empty;
            else
            {
                DateTime jsdate = (DateTime)obj;
                result["Value"] = string.Format("new Date({0},{1},{2},{3},{4},{5})", jsdate.Year, jsdate.Month-1, jsdate.Day, jsdate.Hour, jsdate.Minute, jsdate.Second);
            }
            return result;
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get
            {
                IList<Type> typelist = new List<Type>();
                typelist.Add(typeof(DateTime));
                typelist.Add(typeof(DateTime?));
                return typelist;
            }
        }

以上代码序列化已经测试,反序列化很少用,所以没有测试。

在JS上new Date()有以下几个构造函数

1 new Date(“month dd,yyyy hh:mm:ss”);
2 new Date(“month dd,yyyy”);
3 new Date(yyyy,mth,dd,hh,mm,ss);
4 new Date(yyyy,mth,dd);
5 new Date(ms);

第一个,第二个方式月份是英文,直接使用不方便。

第四个忽略了时间,第五个更蛋痛,居然是时间和GMT时间1970年1月1日之间相差的毫秒数

所以能简单实用的只有第四个了。

这里之所以月份要减一,因为JS的上Mth是从0开始,而C#的datetim.Month是从1开始。

现在我们将序列化规则弄出来了,下一步就是实现序列化

var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
jsonSerializer.RegisterConverters(new System.Web.Script.Serialization.JavaScriptConverter[] { new DateTimeConverter() });
jsonSerializer.Serialize(DateTime.Now);

这样将得到序列化后的Json格式字符串了。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏