Сериализация .NET DateTime в строку Json - PullRequest
1 голос
/ 01 февраля 2012

Я пишу собственный сериализатор Json, чтобы улучшить работу моего сервиса. И да, я принимал во внимание Json.NET, сервисный стек, DataContractJsonSerializer и т. Д. До того, как принял решение. Мои объекты плоские с простыми типами .NET, и я хотел избежать издержек на гораздо большую библиотеку.

В любом случае, здесь я столкнулся с небольшой проблемой. У меня есть код для сериализации DateTime -

    var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
    sb.Append("\"\\/Date(");
    SerializeNumber((time - epoch).TotalMilliseconds, sb);
    sb.Append(")\\/\"");

И это прекрасно работает, за исключением того, что я не могу заставить его соответствовать стандартному сериализатору .NET Json в выводе.

.NET serializer 
"\\/Date(1328057884253)\\/\"
Custom serializer
"\\/Date(1328057884253.04)\\/\"

Хм, поэтому я попытался сделать свое преобразование менее точным и перейти на (int) TotalSeconds вместо миллисекунд, и это дает мне это -

.NET serializer
"\\/Date(1328054810067)\\/\"
Custom serializer
"\\/Date(1328054810)\\/\"

Я предполагаю, что это не будет большим делом, но было бы неплохо, чтобы мои модульные тесты проходили против стандартного сериализатора .NET только для здравого смысла. Есть идеи?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Свойство Всего миллисекунд имеет тип double .Вы можете просто преобразовать его в long вместо использования метода TotalSeconds, который, конечно, не возвращает того же значения ...

var epoch = new DateTime(1970, 1, 1, 0, 0, 0);
sb.Append("\"\\/Date(");
SerializeNumber((long)(time - epoch).TotalMilliseconds, sb);
sb.Append(")\\/\"");

edit Как сказал Кош в комментариях, предпочитайте от long до int , чтобы избежать переполнения емкости.

0 голосов
/ 01 февраля 2012

не могли бы вы просто усечь результат?

Math.Truncate((time - epoch).TotalMilliseconds)

http://msdn.microsoft.com/de-de/library/c2eabd70.aspx

или, может быть, лучше обойти это. Не знаю, что сделает JsonSerializer.

Math.Round((time - epoch).TotalMilliseconds, 0)

http://msdn.microsoft.com/de-de/library/75ks3aby.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...