我需要一些JSON desereialization null值的帮助,输出窗口中有一个错误,但我不知道是什么原因,错误是:
Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
JSON看起来像这样:
[{ “TID”: “1”, “taskdescript”: “罐式”, “taskstatus”: “1”, “用户名”: “管理员”, “prjdescript”: “XXX”, “dateuseraccept”:空下, “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)
行没有返回任何内容,因为去除空值时出错。我该如何解决这个问题呢?
答案 0 :(得分:1)
使用该类,我在尝试反序列化时遇到此错误:
将值{null}转换为' System.DateTime'时出错。路径' [0] .dateuseraccept'
因此,请将班级中的该属性更改为:
Public Property dateuseraccept As DateTime?
' or
Public Property dateuseraccept As Nullable(Of DateTime)
使用您喜欢的任何一种。这里似乎需要DateTime?
/ Nullable(of DateTime)
,因为 json,dateuseraccept
为空。 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
这可能不是唯一的错误,但它对我来说效果很好。