博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]JavaScriptSerializer中日期序列化
阅读量:6434 次
发布时间:2019-06-23

本文共 5351 字,大约阅读时间需要 17 分钟。

本文转自:

 

直接进入主题:

 

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
list = new List
(); 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
>(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
list = new List
(); 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
>(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
dictionary, Type type, JavaScriptSerializer serializer) { return new JavaScriptSerializer().ConvertToType(dictionary, type); } public override IDictionary
Serialize(object obj, JavaScriptSerializer serializer) { if (!(obj is DateTime)) return null; return new CustomString(((DateTime)obj).ToString("yyyy-MM-dd")); } public override IEnumerable
SupportedTypes { get { return new[] { typeof(DateTime) }; } } private class CustomString : Uri, IDictionary
{ public CustomString(string str) : base(str, UriKind.Relative) { } void IDictionary
.Add(string key, object value) { throw new NotImplementedException(); } bool IDictionary
.ContainsKey(string key) { throw new NotImplementedException(); } ICollection
IDictionary
.Keys { get { throw new NotImplementedException(); } } bool IDictionary
.Remove(string key) { throw new NotImplementedException(); } bool IDictionary
.TryGetValue(string key, out object value) { throw new NotImplementedException(); } ICollection
IDictionary
.Values { get { throw new NotImplementedException(); } } object IDictionary
.this[string key] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } void ICollection
>.Add(KeyValuePair
item) { throw new NotImplementedException(); } void ICollection
>.Clear() { throw new NotImplementedException(); } bool ICollection
>.Contains(KeyValuePair
item) { throw new NotImplementedException(); } void ICollection
>.CopyTo(KeyValuePair
[] array, int arrayIndex) { throw new NotImplementedException(); } int ICollection
>.Count { get { throw new NotImplementedException(); } } bool ICollection
>.IsReadOnly { get { throw new NotImplementedException(); } } bool ICollection
>.Remove(KeyValuePair
item) { throw new NotImplementedException(); } IEnumerator
> IEnumerable
>.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
list = new List
(); 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
>(str); textBox1.Text = str; }

执行效果如下:[{"age":10,"date":"2014-06-30","name":"宋兴柱  是个好孩\"子,这里\"有英文逗号"}]

对于方案二来说,由于内部使用的是Uri类,因此,将日期转为字符串如:2014-06-30 11:30:00这 种样式的时候,中间的空格,会被进行Url编码:空格会被编码成:%20。因此会损坏原有的日期格式。不过方案二对于其它类型的使用,依然有借鉴之处。还忘不断探索。

转载地址:http://fxqga.baihongyu.com/

你可能感兴趣的文章
(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?
查看>>
教你彻底学会c语言基础——文件操作
查看>>
如何使用免费控件将Word表格中的数据导入到Excel中
查看>>
seafile服务器配置
查看>>
HyperLedger Fabric 1.2 区块链应用场景(3.1)
查看>>
也谈谈初创公司的技术团队建设
查看>>
阿里云 APM 解决方案地图
查看>>
中国HBase技术社区第一届MeetUp-HBase2.0研讨圆桌会
查看>>
学渣的模块化之路——50行代码带你手写一个common.js规范
查看>>
python——变量
查看>>
subline上装node.js插件
查看>>
python字符串操作实方法大合集
查看>>
Linux学习(十一):不可忽略的Linux支持的文件系统
查看>>
[转]VC++中操作XML(MFC、SDK)
查看>>
WiFi连接风险造成个人信息外泄 网络安全需加强
查看>>
2017(中国)商博会系列介绍之智能生活展
查看>>
eclipse link方式安装 sts(Spring Tool Suite)
查看>>
数据结构思维 第三章 `ArrayList`
查看>>
CentOS6、7编译安装FFmpeg
查看>>
Android项目实战(二十九):酒店预定日期选择
查看>>