Pytanie w sprawie json.net – Zapobiegaj dodawaniu przesunięcia strefy czasowej w programie Json.NET 4.5 podczas korzystania z MicrosoftDateFormat

20

Brak zwyczajuDateTimeConverterBase implementacja, jest jakiś sposób na utrzymanie Json.NET 4.5+, gdy jest ustawiony do użyciaDateFormatHandling.MicrosoftDateFormat, od dodania przesunięcia strefy czasowej dla dowolnego nie-UTCDateTime to jest dane?

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

Zmieniam projekt API z wykorzystaniem wbudowanej platformy .NETJavaScriptSerializer do korzystania z Json.NET do generowania JSON. W Json.NET dla UTCDateTime, domyślna serializacja datetime była podobna do wersji .NET:

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

W przeciwieństwie do innych niż UTCJavaScriptSerializer, Json.NET dołącza przesunięcie strefy czasowej do wyników (-6 dla mojego obszaru, o tej porze roku):

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

Oto kod, którego używam do przełączenia Json.NET 4.5+ z powrotem na\/Date(...)\/ format (tzwMicrosoftDateFormat):

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

Rozwiązanie wydawało się tak proste, jak nakazanie Json.NET użycia innegoDateTimeZoneHandling oprawa. Próbowałem każdego ustawienia dlaDateTimeZoneHandling (Local, Utc, Unspecified, iRoundtripKind) i wszystkie zachowują „-0600” na wyjściu. W rzeczywistości wszystkie one dają identyczne wyniki dla nie-UTCDateTime.

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

Idealnie byłoby, gdybym miał już wszystkie czasy w UTC. Z pewnością planuję to zrobić za pomocą następnej wersji tego API. Ponieważ jest to API na żywo, nie warto ryzykować zmiany danych wyjściowych, dopóki nowa wersja nie zostanie wydana. Wydaje się, że nie stanowi to problemu dla większości systemów analizujących JSON, ale nie mogę ryzykować zmiany, ponieważ standard JSON oficjalnie nie mówi nic o serializacji daty.

Mam też ten problem, dokładnie ten sam problem. kerzek

Twoja odpowiedź

2   odpowiedź
3

Znalazłem rozwiązanie, aby usunąć przesunięcie strefy czasowej zDateTime dla najnowszej wersji 9.0.0:

<code>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"};
</code>
znalezienie takiej odpowiedzi nie powinno być trudne, ponieważ inni nie usuwają informacji o przesunięciu. viggity
11

Wydaje mi się, że działa dobrze, patrz poniżej. Moje zestawienie JSON.NET mówi, że jest to wersja „4.5.0.0”.

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

Może to był błąd, który został naprawiony?

Jawne tworzenie daty:

<code>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)\/"}
</code>
Zatwardziały. Miałem dokładnie ten sam problem. Gdyby JSON.NET 4.5.7 został zaktualizowany do wersji 4.5.8 i teraz poprawnie deserializuje datetime. Chad W

Powiązane pytania