Vb.net 如果没有为DateTimeOffset提供JSON反序列化,则假定为本地时区
所以我用一个简单的设置测试了一整天。我正在将JSON字符串反序列化为类对象。唯一的属性用于Vb.net 如果没有为DateTimeOffset提供JSON反序列化,则假定为本地时区,vb.net,json.net,datetimeoffset,Vb.net,Json.net,Datetimeoffset,所以我用一个简单的设置测试了一整天。我正在将JSON字符串反序列化为类对象。唯一的属性用于DateTimeOffset值。为了测试,我没有提供带有JSON date属性的时区,因为我无法控制第三方将向我发送什么。反序列化后,该属性将假定为系统的时区。我知道这可能是故意的,但是否可以假定UTC,因为我相信这对我的应用程序来说是一个更好的选择 我想要的是:01/01/1900 00:00:00+00:00 我曾尝试使用JsonConverters,但它似乎在到达ReadJson方法之前将其解析为Da
DateTimeOffset
值。为了测试,我没有提供带有JSON date属性的时区,因为我无法控制第三方将向我发送什么。反序列化后,该属性将假定为系统的时区。我知道这可能是故意的,但是否可以假定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)
工作演示:
使用JsonConverter
处理日期时,关键是将DateParseHandling
设置为None
。否则,内部读取器将首先尝试处理它