JavascriptSerializer在序列化时会将DateTime的数据序列化成类似//Date(626543800000)//这样的值,找了很多方法都不如意,最后在一个博客找到了完美的解决方法,地址:http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/,通过自定义类型转换器的方式转换成想要的格式,转换器代码如下:
public class DateTimeConverter : JavaScriptConverter{PRivate string format = "yyyy-MM-dd";public DateTimeConverter(string format){this.format = format;}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(format));}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();}}}
然后注册一下就行了:
public JavaScriptSerializer serializer = new JavaScriptSerializer();serializer.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter("yyyyMMdd") });
这样就可以通过构造函数自定义serializer序列化的对象中包含DateTime类型的值的格式
新闻热点
疑难解答