JSON 如果未为 DateTimeOffset 提供反序列化,则采用本地时区

JSON deserialization assumes local timezone if not provided for DateTimeOffset

所以我一整天都在用一个简单的设置来测试它。我正在将 JSON 字符串反序列化为 class 对象。唯一的 属性 是 DateTimeOffset 值。只是为了测试,我没有提供 JSON 日期 属性 的时区,因为我无法控制第三方发送给我的内容。一旦反序列化,属性 就采用了我系统的时区。我知道这可能是有意为之,但是否可以让它假定 UTC,因为我相信这对我的应用程序来说是更好的选择?

我想要的是:01/01/1900 00:00:00 +00:00

我曾尝试使用 JsonConverters,但它似乎在进入 ReadJson 方法之前将其解析为 DateTimeOffset,并且它无法让我访问 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 时区:

我能够通过以下设置哄骗 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。否则内部 reader 将首先尝试处理它。