问题描述
Newtonsoft JSON 今天从 NuGet(我认为是 V12)、.NET 框架 V4.7.2、Web 服务返回的简化示例中提取。代码和输出如下。所有返回的日期时间表单都声称是 UTC。当反序列化为类的 datetimeoffset 成员时,是否有反序列化设置选项将没有时区信息视为 UTC?示例返回值为“2015-08-04T22:04:50”
如果 datetimeoffset 成员未标记为可空,则不带时区的可解析 datetimeoffset 将返回默认的未初始化值 (1/1/0001 12:00:00 AM +00:00)。换句话说,反序列化是不成功的。使用 DateTimeOffset.Parse 解析时的相同字符串将其视为本地时区并返回本地时区中的有效日期时间。不好,但可以用其他代码处理。
如果 datetimeoffset 成员被标记为可空,则该成员保持空(nothing),这也是不正确的。
类中 datetimeoffset 的初始化值:8/4/2015 10:04:50 PM +00:00
Newtonsoft.Json.JsonConvert.SerializeObject 序列化字符串:{"dtoReturned":"2015-08-04T22:04:50+00:00"}
来自网络服务的序列化字符串:{"dtoReturned":"2015-08-04T22:04:50"}
datetimeoffset 的反序列化值:8/4/2015 10:04:50 PM +00:00
类中未初始化的 datetimeoffset 值:1/1/0001 12:00:00 AM +00:00
日期时间偏移的反序列化值:1/1/0001 12:00:00 AM +00:00
类中 datetimeoffset 的初始化值:8/4/2025 10:04:50 PM +00:00
Newtonsoft.Json.JsonConvert.SerializeObject 序列化字符串:{"dtoReturned":"2025-08-04T22:04:50+00:00"}
来自网络服务的序列化字符串:{"dtoReturned":"2025-08-04T22:04:50"}
datetimeoffset 的反序列化值:8/4/2025 10:04:50 PM +00:00
反序列化前类中的datetimeoffset的值是什么
类中datetimeoffset的反序列化值是什么
导入 System.IO 公开课表1
Private Sub Form1_Load(sender As Object,e As EventArgs) Handles Me.Load
Dim obj1a As New TestClass1 ' transfers_v1_incoming
obj1a.dtoReturned = DateTimeOffset.Parse("2015-08-04T22:04:50Z")
Debug.Print("initialized value of datetimeoffset in class: " & obj1a.dtoReturned.ToString)
Dim strIn As String = Newtonsoft.Json.JsonConvert.SerializeObject(obj1a)
Debug.Print("Newtonsoft.Json.JsonConvert.SerializeObject serialized string: " & strIn)
strIn = Replace(strIn,"+00:00","")
Debug.Print("serialized string from web service: " & strIn)
Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj1a.GetType)
Debug.Print("deserialzied value of datetimeoffset: " & obj1a.dtoReturned.ToString)
Dim obj1b As New TestClass1 ' transfers_v1_incoming
Debug.Print("uninitialized value of datetimeoffset in class: " & obj1b.dtoReturned.ToString)
Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj1b.GetType)
Debug.Print("deserialzied value of datetimeoffset: " & obj1b.dtoReturned.ToString)
Dim obj2a As New TestClass2
obj2a.dtoReturned = DateTimeOffset.Parse("2025-08-04T22:04:50Z")
Debug.Print("initialized value of datetimeoffset in class: " & obj2a.dtoReturned.ToString)
strIn = Newtonsoft.Json.JsonConvert.SerializeObject(obj2a)
Debug.Print("Newtonsoft.Json.JsonConvert.SerializeObject serialized string: " & strIn)
strIn = Replace(strIn,"")
Debug.Print("serialized string from web service: " & strIn)
Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj2a.GetType)
Debug.Print("deserialzied value of datetimeoffset: " & obj2a.dtoReturned.ToString)
Dim obj2b As New TestClass2
If Isnothing(obj2b.dtoReturned) Then
Debug.Print("value of datetimeoffset in class before deserialize is nothing")
Else
Debug.Print("uninitialized value of datetimeoffset in class before deserialize: " & obj2b.dtoReturned.ToString)
End If
Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj2b.GetType)
If Isnothing(obj2b.dtoReturned) Then
Debug.Print("deserialzied value of datetimeoffset in class is nothing")
Else
Debug.Print("deserialzied value of datetimeoffset: " & obj2b.dtoReturned.ToString)
End If
End Sub
Class TestClass1
Public Property dtoReturned As DateTimeOffset
End Class
Class TestClass2
Public Property dtoReturned As DateTimeOffset?
End Class
结束课程
解决方法
您调用 Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj.GetType)
就好像它要改变 obj
变量一样。不会。
相反,您需要使用此方法返回的对象。您还需要将其投射到您的班级。
obj = CType(Newtonsoft.Json.JsonConvert.DeserializeObject(strIn,obj.GetType),TestClass1)
或者更简单,使用采用泛型类型定义的重载:
obj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of TestClass1)(strIn)