2016-06-05 4 views
0

мне нужна помощь в JSON desereialization от нулевого значения, есть ошибка в окне вывода, но я не знаю, что является причиной, ошибка:десериализации нулевое значение в формате JSON

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

JSON выглядит следующим образом:

[{ "TID": "1", "taskdescript": "Танк", "taskstatus": "1", "имя пользователя": "администратор", "prjdescript":» XXX "," dateuseraccept ": null," expectedduration ":" 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

Это недопустимо json. Есть много дополнительных котировок. У вас есть лучшая версия/копия? – Plutonix

+0

Я обновил JSON, так он выводится скриптом php. – Starlays

+0

Это лучше - у старого даже были отмечены отметки ':'. Действительно ли звезды вокруг нулевого? или это вы? – Plutonix

ответ

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 - null. A Nullable позволяет переменной хранить null/Nothing или действительное время и дату.

Так как ваша ошибка исходит от Newtonsoft.Json.dll, и только код с Json является вашим DeserializeObject, это, вероятно, тот же источник.

Теперь, поскольку это свойство может быть DateTime или нуль/Nothing, используйте HasValue чтобы определить, какой случай:

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

Это не может быть единственным неправильно, но она отлично работает для меня что.

Nullable(Of T)

Смежные вопросы