2016-06-05 32 views
0

ich etwas Hilfe in JSON desereialization von Nullwert benötigen, gibt es einen Fehler in dem Fenster Ausgabe, aber ich weiß nicht, was die Ursache ist, der Fehler ist:Deserialisieren Nullwert in JSON

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

Der JSON sieht wie folgt aus:

[{ "TID": "1", "taskdescript": "Tank", "Taskstatus": "1", "username": "Administrator", "prjdescript":“ XXX "," dateuseraccept ": null," geschätzteZeit ":" 0 "," actualduration ":" 0 "}]

Der Teil des Codes, der die deserialize ist der Umgang sieht wie folgt aus:

..... 
    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 

Die Klasse ist:

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 

Die Linie mit MsgBox(oneVar.TID.ToString) nicht nichts zurückgeben, aufgrund des Fehlers wenn der Nullwert deserialisiert wird. Wie kann ich das Problem lösen?

+0

Das ist nicht gültig json. Dort sind viele zusätzliche Zitate drin. Hast du eine bessere Version/Kopie? – Plutonix

+0

Ich habe den JSON aktualisiert, so wird es vom PHP-Skript ausgegeben. – Starlays

+0

Das ist besser - der alte hatte sogar die ':' Noten zitiert. Hat es wirklich Sterne um die Null? oder bist du das? – Plutonix

Antwort

1

diese Klasse verwenden, bekomme ich diesen Fehler zu deserialisieren versuchen:

Fehler beim Konvertieren Wert {null} 'System.DateTime' eingeben. Pfad '[0] .dateuseraccept'

So diese Eigenschaft in der Klasse ändern:

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

Verwenden welches Sie bevorzugen. DateTime?/Nullable(of DateTime) scheint hier gebraucht zu werden, da json, dateuseraccept null ist. A Nullable ermöglicht der Variablen, null/Nothing oder eine gültige Datetime zu speichern.

Da Ihr Fehler von Newtonsoft.Json.dll kommt und der einzige Code, der Json betrifft, ist Ihr , es ist wahrscheinlich die gleiche Quelle.

Jetzt, da diese Eigenschaft kann ein DateTime oder null/Nothing sein, verwenden HasValue zu bestimmen, welche der Fall ist:

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

Es ist vielleicht nicht das einzige, was falsch sein, aber es funktioniert gut für mich mit Das.

Nullable(Of T)