VB.NET конвертирует объект в JSON - PullRequest
0 голосов
/ 20 июня 2019

Я создаю веб-запрос типа POST, но преобразованный JSON имеет неправильный формат.Ниже моя функция:

Public Function CreateWebRequestPOST(ByVal strURL As String, objInput As Object) As JArray
        Try
            'Serialize the posted data & convert to bytes
            Dim inputJson = (New JavaScriptSerializer()).Serialize(objInput)
            Dim bytes As Byte() = Encoding.UTF8.GetBytes(inputJson)

            Dim request As HttpWebRequest = DirectCast(WebRequest.Create(strURL), HttpWebRequest)
            request.Method = "POST"
            request.ContentType = "application/json"
            request.Accept = "application/json"
            request.ContentLength = bytes.Length
            request.Expect = "application/json"
            request.GetRequestStream().Write(bytes, 0, bytes.Length)

            Dim username = "username"
            Dim password = "passoword"
            request.Credentials = New NetworkCredential(username, password)


            Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
                Dim reader As StreamReader
                Dim rawresp As String
                reader = New StreamReader(response.GetResponseStream())
                rawresp = reader.ReadToEnd()
                Dim array As JArray = JArray.Parse(rawresp)
                reader.Close()
                response.Close()
                Return array
            End Using
        Catch ex As Exception
            Dim empty As New JArray
            Return empty
        End Try
    End Function

Объект, который я отправляю в параметре, выглядит следующим образом:

Dim objReq As New RequestBodyList
Dim orderlist As New OrderList

orderlist.currency = "test"
orderlist.id = "test"
orderlist.amount = 100

objReq.apiOperation = "some_action"
objReq.order = orderlist


Dim response = main.CreateWebRequestPOST("some_URL", objReq)

Public Class RequestBodyList
    Public Property apiOperation() As String
    Public Property order() As New OrderList
End Class

Public Class OrderList
    Public Property currency() As String
    Public Property id() As String
    Public Property amount() As Integer
End Class

Ниже приведен пример вывода переменной inputJSON:

"{""apiOperation"":""Some_action"",""order"":{""currency"":""USD"",""id"":""test1234"",""amount"":100}}"

Похоже, преобразованный JSON не является правильным форматом.Что здесь было сделано неправильно?Что привело к появлению двойных кавычек?

Вот как должно быть отправлено тело запроса:

Тело запроса (объект JSON)

{ 
    "apiOperation": "some_action", 
    "order": {
        "currency": "USD",
        "id": "some_order_id" ,
        "amount": 50
    } 
}

Ответы [ 2 ]

1 голос
/ 20 июня 2019
Public Function CreateWebRequestPOST(ByVal strURL As String, objInput As Object) As JObject
        Try
            'Serialize the posted data & convert to bytes
            Dim inputJson = (New JavaScriptSerializer()).Serialize(objInput)
            Dim bytes As Byte() = Encoding.UTF8.GetBytes(inputJson)

            Dim request As HttpWebRequest = DirectCast(WebRequest.Create(strURL), HttpWebRequest)
            request.Method = "POST"
            request.ContentType = "application/json"
            request.Accept = "application/json"
            request.ContentLength = bytes.Length
            request.Expect = "application/json"
            request.GetRequestStream().Write(bytes, 0, bytes.Length)

            Dim username = "username"
            Dim password = "passoword"
            request.Credentials = New NetworkCredential(username, password)


            Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
                Dim reader As StreamReader
                Dim rawresp As String
                reader = New StreamReader(response.GetResponseStream())
                rawresp = reader.ReadToEnd()
                Dim array As JObject = JObject.Parse(rawresp)
                reader.Close()
                response.Close()
                Return array
            End Using
        Catch ex As Exception

        End Try
    End Function

Закончилось понимание, что возвращаемый тип должен иметь тип Object, а не Jarray.

0 голосов
/ 20 июня 2019

не могу комментировать, поэтому нужно вставить его в качестве ответа! Можете ли вы дать немного больше деталей. Когда вы говорите ...

Ниже приведен пример вывода для переменной inputJSON:

Можете ли вы подтвердить, что вы думаете, что это неправильно с форматом, что касается моего ограниченного опыта, это просто выглядит хорошо.

Ниже приведен фрагмент кода из одного из моих проектов и то, как я обрабатываю вывод JSON в потоковом считывателе, а затем использую JsonConvert.DeserializeObject, немного округляя, но он дозирует работу и в итоге становится более читабельным.

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

Function test()

    Try

        'Get obligations
        Dim origResponse As HttpWebResponse
        Dim AccessToken As String = Access_Token
        Dim origRequest As HttpWebRequest = Nothing

        origRequest = DirectCast(HttpWebRequest.Create("https://api.service.hmrc.gov.uk/organisations/vat/" + CoVRN + "/obligations?from=2019-01-01&to=" + Now.ToString("yyyy-MM-dd") + "&status=O"), HttpWebRequest) 'for testing

        origRequest.Accept = "application/vnd.hmrc.1.0+json"
        origRequest.Headers.Add("Authorization", "Bearer " + AccessToken)
        origRequest.Method = "GET"
        origResponse = DirectCast(origRequest.GetResponse(), HttpWebResponse)
        Dim reader As IO.StreamReader = New IO.StreamReader(origResponse.GetResponseStream(), Text.Encoding.Default)
        Dim content As String = reader.ReadToEnd()
        Dim myResults = JsonConvert.DeserializeObject(Of RootObligation)(content)


    Catch webEx As WebException
        Dim errorMessage As String = webEx.Message
        Dim errorStack As String = webEx.StackTrace
        Dim stream = webEx.Response.GetResponseStream()
        Dim reader = New StreamReader(stream)
        Dim ReadableError As String = reader.ReadToEnd().ToString
        Dim myResults = JsonConvert.DeserializeObject(Of RootError)(ReadableError)

    Catch ex As Exception
        Dim errorMessage As String = ex.Message
        Dim errorStack As String = ex.StackTrace

        Session("message") = "Error in submission ex:" + ex.Message + " " + errorStack
        Return RedirectToAction("VATSubmission", "Transaction")

    End Try

End Function
...