Правильная сериализация дат с помощью сериализатора javascript в asp.net mvc3
Я экспериментирую с магистральным javascript после просмотра скриншотов Tekpub MVC3 Роба Коннери
Мне нравится его доступ к базе данных Massive, но как только он станет немного сложнее, чем видео, возможно, покажу вам.
я добавил дополнительные поля в свою базу данных, будучи datetime
поля. однако этот сериализатор javascript преобразует их в строки
public string toJson(dynamic content) {
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoObjectConverter() });
var json = serializer.Serialize(content);
return json.ToString();
}
это делает datetime из этого: {19/10/2011 1:58:27}
в это: "19/10/2011"
(* значения, взятые из окна быстрого просмотра во время выполнения..., в основном сводятся к потере точности и теперь являются базовой строкой.
после того, как магистраль отправляет это обратно на сервер (по вызову model.save()), я пытаюсь обновить модель, как это делает Роб:
[HttpPut]
public ActionResult Edit()
{
var model = SqueezeJson();
model.UpdatedAt = DateTime.Now;
_movies.Update(model, model.Id);
return CmoJSON(model);
}
для функции SqueezeJson, проверьте его источник
приводя к ошибке, как это:
Arithmetic overflow error converting expression to data type datetime.
Я как бы ожидал, что это произойдет, так как я заметил, что даты сбрасываются в строки, я понятия не имел, как они будут возвращаться в дату, используя массив.
кто-нибудь работал с массивами и датами в таком контексте (сериализация в и из json)? я знаю, что проблема сама по себе не обязательно носит массовый характер, это сериализация json, которая превращает ее в строку с потерей данных и не возвращает ее к правильной дате.
но все же, возможно, у кого-то есть лучший способ сделать это... любая идея приветствуется...
1 ответ
Я столкнулся с тем же вопросом с вами.
Вы можете изменить метод Serialize в ExpandoObjectConverter, например:
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
ExpandoObject expando = (ExpandoObject) obj;
if(expando!=null)
{
Dictionary<string,object> result = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> item in expando)
{
var value = item.Value ?? "";
if (value is DateTime)
result.Add(item.Key, ((DateTime) value).ToString("yyyy.MM.dd"));
else
{
result.Add(item.Key, value.ToString());
}
}
return result;
}
return new Dictionary<string, object>();
}