Десериализация JSON предполагает использование местного часового пояса, если он не указан для DateTimeOffset - PullRequest
2 голосов
/ 07 октября 2019

Так что я тестировал это весь день с простой настройкой. Я десериализирую строку JSON в объект класса. Единственное свойство для значения DateTimeOffset. Просто для проверки я не предоставляю часовой пояс со свойством даты JSON, так как я не смогу контролировать то, что мне отправит третья сторона. После десериализации свойство приняло часовой пояс моей системы. Я понимаю, что это, вероятно, намеренно, но возможно ли сделать так, чтобы оно предполагало UTC, поскольку я считаю, что это было бы лучшим вариантом для моего приложения?

То, что я хочу, чтобы это было: 01/01/1900 00:00:00 +00:00

Я пытался использовать JsonConverters, но кажется, что он анализируется как DateTimeOffset, прежде чем он перейдет к методу ReadJson, и он не дает мне доступ к строковой версии значения свойства JSON, поэтому я могуразбери это правильно.

Код и пример ниже:

Public Class MyTest

    Public Property DTO As DateTimeOffset = #1900-01-01#

End Class

Public Sub TestMethod()

    Dim myDate As String = "{""DTO"": ""1900-01-01T00:00:00""}"

    Dim o = JsonConvert.DeserializeObject(Of MyTest)(myDate, 
        New JsonSerializerSettings With {
            .DateParseHandling = DateParseHandling.DateTimeOffset,
            .DateTimeZoneHandling = DateTimeZoneHandling.Utc
        })

 End Sub

Как вы можете видеть, он принял +2 часовой пояс:

Screenshot of myDate after deserialization

1 Ответ

2 голосов
/ 07 октября 2019

Мне удалось уговорить Json.Net обработать DateTimeOffset без смещения как UTC со следующими настройками:

Dim settings As New JsonSerializerSettings With {
    .DateParseHandling = DateParseHandling.None
}
settings.Converters.Add(New IsoDateTimeConverter With {
    .DateTimeStyles = DateTimeStyles.AssumeUniversal
})

Dim o = JsonConvert.DeserializeObject(Of MyTest)(myDate, settings)

Рабочая демонстрация: https://dotnetfiddle.net/Vgc9is

Ключ прииспользование JsonConverter для обработки дат означает установку DateParseHandling на None. В противном случае внутренний читатель сначала попытается обработать его.

...