在JSON中反序列化空值

时间:2016-06-05 19:29:12

标签: vb.net json.net

我需要一些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)行没有返回任何内容,因为去除空值时出错。我该如何解决这个问题呢?

1 个答案:

答案 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

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

Nullable(Of T)