在 JSON 中反序列化空值



我需要一些帮助来解冻空值的 JSON 分离,输出窗口中有一个错误,但我不知道是什么原因,错误是:

Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll

JSON 如下所示:

[{"TID":"1","taskdescript":"Tank","taskstatus":"1","用户名":"administrator","prjdescript":"XXX","dateuseraccept":null,"estimatedduration":"0","actualduration":"0"}]

处理反序列化的代码部分如下所示:

    .....
    Dim responsebody = (New Text.UTF8Encoding).GetString(responsebytes)
    'Dim settings = New JsonSerializerSettings()
    'settings.NullValueHandling = NullValueHandling.Include
    'settings.MissingMemberHandling = MissingMemberHandling.Ignore
    'settings.DateParseHandling = DateParseHandling.None
    Console.WriteLine(responsebody)
    Dim datacollection = JsonConvert.DeserializeObject(Of jsonPrjData())(responsebody)
    For Each oneVar As jsonPrjData In datacollection
        ' Avoid Nothing vars.
        MsgBox(oneVar.TID.ToString)
        If oneVar IsNot Nothing Then
            datagrid.Rows.Add(oneVar.TID, oneVar.taskDescript, oneVar.taskStatus, oneVar.prjDescript, oneVar.username, oneVar.dateUserAccept.ToString("dd-MM-yyyy"), oneVar.estimatedDuration, oneVar.actualDuration)
        End If
    Next

该类是:

Public Class jsonPrjData
    Public Property TID() As Int16
    Public Property taskDescript() As String
    Public Property taskStatus() As Int16
    Public Property username() As String
    Public Property prjDescript() As String
    Public Property dateUserAccept() As Date
    Public Property estimatedDuration() As Int16
    Public Property actualDuration() As Int16
End Class

带有 MsgBox(oneVar.TID.ToString) 的行不返回任何内容,因为在取消 null 值时出错。如何解决问题?

使用该类,我在尝试反序列化时收到此错误:

将值 {null} 转换为类型"System.DateTime"时出错。路径 '[0].dateuseraccept'

因此,将类中的该属性更改为:

Public Property dateuseraccept As DateTime?
' or
Public Property dateuseraccept As Nullable(Of DateTime)

使用您喜欢的任何一种。 这里似乎需要DateTime?/Nullable(of DateTime)因为在该 JSON 中,dateuseraccept 为 null。Nullable允许变量存储 null/Nothing 有效的日期时间。

由于您的错误来自Newtonsoft.Json.dll并且唯一涉及 Json 的代码是您的DeserializeObject,因此它可能是同一来源。

现在,由于该属性可以是 DateTime 或 null/Nothing,因此请使用 HasValue 来确定哪种情况:

If item.dateuseraccept.HasValue Then
    Console.WriteLine(item.dateuseraccept)
Else
    Console.WriteLine("No Date")
End If

这可能不是唯一的错误,但它对我来说效果很好。

可为空(T)

相关内容

  • 没有找到相关文章

最新更新