当前位置: 首页 > 知识库问答 >
问题:

如果类中的目标已初始化,则newtonsoft json将有效日期时间反序列化为可空的日期时间偏移不同的行为

阎承
2023-03-14

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将其视为本地时区,并返回本地时区中的有效日期时间。不好,但是可以用其他代码处理。

如果date时间偏移成员被标记为可空,则该成员保持为空(无),这也是不正确的。

类中日期时间偏移量的初始化值: 8/4/2015 10:04:50 PM 00:00

纽顿软件。JSON . JSON convert . serialize object序列化字符串:{ " dtore turned ":" 2015-08-04t 22:04:50 00:00 " }

来自web服务的序列化字符串:{ " dtore turned ":" 2015-08-04t 22:04:50 " }

datetimeoffset的取消排序值:8/4/2015 10:04:50 PM 00:00

类中未初始化的datetimeoffset值:1/1/0001 12:00:00 AM 00:00

datetimeoffset的非序列化值:1/1/0001 12:00:00 AM 00:00

类中datetimeoffset的初始化值:8/4/2025 10:04:50 PM 00:00

纽顿软件。JSON . JSON convert . serialize object序列化字符串:{ " dtore turned ":" 2025-08-04t 22:04:50 00:00 " }

来自web服务的序列化字符串:{ " dtore turned ":" 2025-08-04t 22:04:50 " }

datetimeoffset的非序列化值:2025年8月4日10:04:50 PM 00:00

反序列化前类中日期时间偏移量的值为无

类中datetimeoffset的deserialzied值为空

进口系统。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, "+00:00", "")
    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

结束类

共有1个答案

卢雅惠
2023-03-14

您正在调用Newtonsoft.Json.JsonConvert。反序列化对象(strIn,obj.GetType),就好像它要变异obj变量一样。不会的。

相反,您需要使用从该方法返回的对象。您还需要将它强制转换到您的类中。

obj = CType(Newtonsoft.Json.JsonConvert.DeserializeObject(strIn, obj.GetType), TestClass1)

或者更简单,使用采用泛型类型定义的重载:

obj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of TestClass1)(strIn)
 类似资料:
  • 我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8。我向ObjectMapper注册了JavaTimeModule,并关闭了设置。 但是,如果试图反序列化将不起作用,因为JavaTimeModule似乎只会反序列化使用UTC时区偏移量格式化的日期时间(例如)。然后我尝试使用注释,如下所示: 就像这样: 然而,这两种方法都不起作用,我得到了一个例外: 这意味着timezone

  • 问题内容: 我正在尝试使用Jackson 将ISO8601格式的日期反序列化为Java8 。我向ObjectMapper注册了JavaTimeModule,并关闭了该设置。 但是,如果尝试反序列化,它将无法正常工作,因为JavaTimeModule似乎只会反序列化具有UTC时区偏移量的日期时间(例如)。然后,我尝试使用如下注释: 像这样: 但是,这些都不起作用,我得到一个例外: 这意味着将忽略ti

  • 问题内容: 为什么json序列化不适用于datetime对象。据我了解json序列化,任何对象的基本思想都可以调用 内置函数,然后对作为响应得到的对象进行urlencode。但是在日期时间的情况下,我得到以下错误 虽然有一种方法可以将已经可用的对象进行字符串化,但是似乎有意识地决定不这样做,为什么会这样呢? 问题答案: 不,它在模块中无法正常工作。该模块为您提供了默认的编码器:。您需要扩展它以提供

  • 我需要将查询中的日期值转换为带有时区的时间戳,但目前我得到的时区区域(“欧洲/巴黎”)是EF使用的无效区域。 例如,在执行此操作时:

  • 我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass:

  • 下面是我的问题的一个简单例子, 例如,用户选择了一个时区“America/New_York”,因此日历页面中的所有日期都将显示在该时区中。 现在,如果我们在“05:00 pm”创建一个事件,那么我们如何在“America/New_York”时区中创建时间为5pm的日期, 谢谢