日期:2014-06-10 浏览次数:20659 次
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类型的值的格式