System.Web.Script.Serialization.JavaScriptSerializer Метод десериализации генерирует ошибку для значений Null - PullRequest
0 голосов
/ 15 января 2019

Я получаю сообщение об ошибке «Невозможно преобразовать NULL в тип значения». Я видел несколько других ответов об игнорировании нулевых значений, но не могу найти это свойство в классе Javascriptserializer. (или любой другой класс сериализации, предлагаемый .NET)

У меня есть следующая функция, которая использует httpwebrequest для получения строки JSON ......

  Public Shared Function GetPagerAssignments(Optional ByVal ActiveOnly As Boolean = True) As List(Of PagerAssignment)
    Dim mylist As New List(Of PagerAssignment)

    Dim myrequest As HttpWebRequest = HttpWebRequest.Create("My URL Here")
    myrequest.Proxy = Nothing
    myrequest.UserAgent = "PAGER"
    myrequest.Method = "GET"

    Dim myresponse As HttpWebResponse = myrequest.GetResponse
    Dim mystream As System.IO.Stream = (myresponse.GetResponseStream)

    Dim streamreader As New System.IO.StreamReader(mystream)

    Dim myjsonstring As String = streamreader.ReadToEnd

    Try
        Dim jss = New JavaScriptSerializer()


        mylist = jss.Deserialize(Of List(Of PagerAssignment))(myjsonstring)

    Catch ex As Exception
        MessageBox.Show("ERROR GETTING PAGER ASSIGNMENTS: " & ex.ToString)
    End Try

    Return mylist
end function

У меня в строке JSON есть значение даты, которое возвращает значение NULL, но мне нужно это использовать. Вот мой JSON ..

[
{
""ID"":""283"",
""FirstName"":""JOHN"",
""LastName"":""DOE"",
""AssignedDate"":{""date"":""2019-01-14 09:35:15.573000"",""timezone_type"":3,""timezone"":""America\/Tegucigalpa""},
""RegisteredDate"":{""date"":""2019-01-14 19:46:43.883000"",""timezone_type"":3,""timezone"":""America\/Tegucigalpa""},
""DoctorID"":""54"",
""RoomNumber"":""999"",
""PagerID"":""14"",
""AssigningUser"":""BILLYBOB"",
""Procedure"":""NONE"",
""Notes"":"""",
""ReturnStatus"":0,
""ReturnedDate"":null,
""IsHeld"":0,
""HasOrientation"":0,
""PagerTypeID"":""1"",
""DoctorName"":""PEPPER, DR"",
""PagerName"":""14"",
""PagerTypeName"":""Family""
},
{""ID"":""297"",
""FirstName"":""BUGS"",
""LastName"":""BUNNY"",
""AssignedDate"":{""date"":""2019-01-14 20:29:17.937000"",""timezone_type"":3,""timezone"":""America\/Tegucigalpa""},
""RegisteredDate"":null,
""DoctorID"":""81"",
""RoomNumber"":""45"",
""PagerID"":""20"",
""AssigningUser"":""HOMER S"",
""Procedure"":""54545"",
""Notes"":"""",
""ReturnStatus"":0,
""ReturnedDate"":null,
""IsHeld"":0,
""HasOrientation"":0,
""PagerTypeID"":""1"",
""DoctorName"":""MONROE, MARVIN"",
""PagerName"":""20"",
""PagerTypeName"":""Family""
},
{""ID"":""295"",
""FirstName"":""DAFFY"",
""LastName"":""DUCK"",
""AssignedDate"":{""date"":""2019-01-14 16:11:06.830000"",""timezone_type"":3,""timezone"":""America\/Tegucigalpa""},
""RegisteredDate"":{""date"":""2019-01-14 19:55:50.290000"",""timezone_type"":3,""timezone"":""America\/Tegucigalpa""},
""DoctorID"":""81"",
""RoomNumber"":""876"",
""PagerID"":""24"",
""AssigningUser"":""BART S"",
""Procedure"":""TEST PROCEDURE"",
""Notes"":"""",
""ReturnStatus"":0,
""ReturnedDate"":null,
""IsHeld"":0,
""HasOrientation"":0,
""MRN"":""8734"",
""PagerTypeID"":""1"",
""DoctorName"":""GOODE, PHIL"",
""PagerName"":""24"",
""PagerTypeName"":""Family""
}

]

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вот некоторый тестовый код, который я использовал. Он не выдал исключение, которое вы видите:

Module Module1
Sub Main()
    Dim json = "[{'Id':1 'RecordDate': null},{'Id':2 'RecordDate': null}]"
    GetPagerAssignments(json)
    Console.Read()
End Sub

Public Function GetPagerAssignments(dataAsJson As String) As List(Of PagerAssignment)
    Dim mylist As New List(Of PagerAssignment)


    Try
        Dim jss = New JavaScriptSerializer()


        mylist = jss.Deserialize(Of List(Of PagerAssignment))(dataAsJson)

    Catch ex As Exception
        'MessageBox.Show("ERROR GETTING PAGER ASSIGNMENTS: " & ex.ToString)
    End Try

    Return mylist
End Function
End Module 

А вот класс, который я использовал:

Friend Class PagerAssignment
   Public Id As Int32
   Public RecordDate As DateTime?
End Class
0 голосов
/ 15 января 2019

Этот класс не рекомендуется для использования по документам . Вот альтернативная реализация, использующая Json.Net, которая должна работать create при условии, что ваш класс PagerAssignment принимает пустые значения для RecordData.

    Public Function GetPagerAssignments(Optional ByVal ActiveOnly As Boolean = True) As List(Of PagerAssignment)
    Dim mylist As New List(Of PagerAssignment)

    Dim myrequest As HttpWebRequest = HttpWebRequest.Create("My URL Here")
    myrequest.Proxy = Nothing
    myrequest.UserAgent = "PAGER"
    myrequest.Method = "GET"

    Dim myresponse As HttpWebResponse = myrequest.GetResponse
    Dim mystream As System.IO.Stream = (myresponse.GetResponseStream)

    Dim streamreader As New System.IO.StreamReader(mystream)

    Dim myjsonstring As String = streamreader.ReadToEnd

    Try
        mylist = Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of PagerAssignment))(myjsonstring)

    Catch ex As Exception
        MessageBox.Show("ERROR GETTING PAGER ASSIGNMENTS: " & ex.ToString)
    End Try

    Return mylist
End Function

Надеюсь, это поможет.

...