Вопрос по – Предотвратить Json.NET 4.5 от добавления смещения часового пояса при использовании MicrosoftDateFormat

20

Если не считать обычаяDateTimeConverterBase реализации, есть ли какой-то способ сохранить Json.NET 4.5+, когда он настроен на использованиеDateFormatHandling.MicrosoftDateFormatот добавления смещения часового пояса для любого не UTCDateTime это дано?

<code>"\/Date(1333645844276-0600)\/"
</code>
Details

Я переключаю проект API с использованием встроенного .NETJavaScriptSerializer использовать Json.NET для создания JSON. В Json.NET для UTCDateTime, сериализация даты и времени по умолчанию была похожа на версию .NET:

<code>"\/Date(1333645844276)\/"
</code>

Для не UTC, в отличие отJavaScriptSerializerJson.NET добавляет смещение часового пояса к результатам (-6 для моей области, это время года):

<code>"\/Date(1333645844276-0600)\/"
</code>

Вот код, который я использую для переключения Json.NET 4.5+ обратно на\/Date(...)\/ формат (называетсяMicrosoftDateFormat):

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
</code>

Решение казалось, что это будет так же просто, как сказать Json.NET использовать другойDateTimeZoneHandling установка. Я перепробовал все настройки дляDateTimeZoneHandling (Local, Utc, Unspecified, а такжеRoundtripKind) и все они поддерживают "-0600" на выходе. Фактически, все они дают идентичные результаты для не UTCDateTime.

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"
</code>
Caveat

В идеале я бы все время провел в UTC. Я, конечно, планирую сделать это со следующей версией этого API. Так как это живой API, не стоит рисковать выходным изменением, пока не будет выпущена новая версия. Похоже, что это не проблема для большинства систем синтаксического анализа JSON, но я не могу рисковать этим изменением, поскольку стандарт JSON официально ничего не говорит о сериализации дат.

У меня тоже есть эта проблема, точно такая же проблема. kerzek

Ваш Ответ

2   ответа
11

это работает нормально для меня, см. Ниже. Моя сборка JSON.NET говорит, что это версия "4.5.0.0".

JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"

Возможно, это была ошибка, которая была исправлена?

Явно создавая дату:

var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
    }));
// {"thedate":"\/Date(1234652400000)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}
Подтверждено. У меня была точно такая же проблема. Был JSON.NET 4.5.7, обновлен до 4.5.8 и теперь корректно десериализует дату и время.
3

DateTime для последней версии 9.0.0:

var time = DateTime.Now;

Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));

//"{"thedate": "2016-12-15T09:20:00.9375403"};
найти такой ответ не должно было быть так сложно, потому что другие не отбрасывают информацию о смещении.

Похожие вопросы