Согласно примечаниям MDSN на JavaScriptSerializer:
Объект Date, представленный в формате JSON как "/ Date (количество тиков) /". Число тиков - это положительное или отрицательное длинное значение, которое указывает количество тиков (миллисекунд), прошедшее с полуночи 1 января 1970 года по Гринвичу.
Максимальное поддерживаемое значение даты - MaxValue (31.12.9999 11:59:59 PM), а минимальное поддерживаемое значение даты - MinValue (1/1/0001 12:00:00 AM).
Вам необходимо зарегистрировать JavaScriptConverter
для DateTime
, который обрабатывает ваш тип:
public class DateTimeConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary == null)
throw new ArgumentNullException("dictionary");
if (type == typeof(DateTime))
{
DateTime time;
time = DateTime.Parse(dictionary["Time"].ToString(), /** put your culture info here **/);
return time;
}
return null;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
DateTime? time = obj as DateTime?;
if (time == null)
{
Dictionary<string, object> result = new Dictionary<string, object>();
result["Time"] = time.Value;
return result;
}
return new Dictionary<string, object>();
}
public override IEnumerable<Type> SupportedTypes
{
get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(DateTime) })); }
}
}
Имейте в виду, что вам нужно учитывать, что ваш JSON фактически будет иметь в терминах имен свойств объекта (вы, вероятно, используете имя, отличное от «Time»).
Зарегистрируйте его на своем JavaScriptSerializer:
serializer.RegisterConverters(new List<JavaScriptConverter>() { new DateTimeConverter() });
Наконец, обратите внимание, что можно сделать еще больше, и это только пример, на котором можно основываться. Явно, он ищет элементы словаря с именем «Time» и не обрабатывает ошибки разбора. У вас может быть более одного имени для полей, использующих DateTime.