自定义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格式字符串了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
2011-12-19 更新nuget1.6错误的解决办法