我需要一些帮助来解冻空值的 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)