2017-08-19 4 views
0

Ich bin neu in VB.NET und arbeite an einem einfachen Programm, das zwei Variablen in JSON serialisieren und die Daten an einen Webserver senden wird. Die Daten werden vom Python-Server empfangen, geben jedoch einen Fehler beim Deserialisieren der Daten.Serialisierte JSON in VB.NET nicht vom Webserver erkannt

Die Eingänge sind:

tester_id = 2 
operation = "P" 

Wenn serialisiert das wie folgt aussieht:

{ 
    "tester_id": 2, 
    "operation": "P" 
} 

Unser Server einen Fehler geben und hat folgende Protokoll.

[Sat Aug 19 13:46:53.485257 2017] [:error] [pid 17352] <QueryDict: {u'{\\r\\n "tester_id": 2,\\r\\n "operation": "P"\\r\\n}': [u'']}> 

Dies deutet darauf hin, dass es einen Schlüssel empfängt:

{u'{\\r\\n "tester_id": 2,\\r\\n "operation": "P"\\r\\n} 

Mit einem Wert von:

[u''] 

Das ist nicht richtig und ich verstehe nicht, warum es so empfangen zu werden, wird jede Hilfe sehr geschätzt! Siehe unten für den VB.NET-Code.

Klasse:

Public Class JSON_get_sensor_id_POST 
Public Property tester_id() As Integer 
    Get 
     Return m_tester_id 
    End Get 
    Set(ByVal value As Integer) 
     m_tester_id = value 
    End Set 
End Property 
Private m_tester_id As Integer 

Public Property operation() As String 
    Get 
     Return m_operation 
    End Get 
    Set(ByVal value As String) 
     m_operation = value 
    End Set 
End Property 
Private m_operation As String 
End Class 

Anruffunktion:

Dim set_tester_id As Integer = 1 
    Dim set_operation As String = "P" 
    Dim manuf_url As String = "https://XYZ...." 

    Dim JSON_to_send As New JSON_get_sensor_id_POST 
    JSON_to_send.tester_id = set_tester_id 
    JSON_to_send.operation = set_operation 

    Dim postData = JsonConvert.SerializeObject(JSON_to_send, Formatting.Indented) 
    Dim return_object = POST_to_Server(manuf_url, postData) 

Upload-Funktion:

Private Function POST_to_Server(ByVal post_url As String, ByVal JSON_to_post As Object) 
    Dim user_login As String = "[email protected]" 
    Dim user_pass As String = "blah" 

    Dim myCache As New CredentialCache() 
    myCache.Add(New Uri(post_url), "Basic", New NetworkCredential(user_login, user_pass)) 

    ' Create a request using a URL that can receive a post. 
    Dim request As WebRequest = WebRequest.Create(post_url) 
    ' Set the Method property of the request to POST. 
    request.Credentials = myCache 
    request.Method = "POST" 
    request.ContentType = "application/json" 
    ' Create POST data and convert it to a byte array. 
    Dim byteArray As Byte() = Encoding.Default.GetBytes(JSON_to_post) 
    ' Set the ContentLength property of the WebRequest. 
    request.ContentLength = byteArray.Length 
    ' Get the request stream. 
    Dim dataStream As Stream = request.GetRequestStream() 
    ' Write the data to the request stream. 
    dataStream.Write(byteArray, 0, byteArray.Length) 
    ' Close the Stream object. 
    dataStream.Close() 
    ' Get the response. 
    Dim response As WebResponse = request.GetResponse() 
    ' Display the status. 
    Console.WriteLine(CType(response, HttpWebResponse).StatusDescription) 
    ' Get the stream containing content returned by the server. 
    dataStream = response.GetResponseStream() 
    ' Open the stream using a StreamReader for easy access. 
    Dim reader As New StreamReader(dataStream) 
    ' Read the content. 
    Dim responseFromServer As String = reader.ReadToEnd() 
    ' Display the content. 
    DebugMessage(responseFromServer) 
    ' Clean up the streams. 
    reader.Close() 
    dataStream.Close() 
    response.Close() 
    Dim myObject = JsonConvert.DeserializeObject(Of JSON_sensor_id_request_return)(responseFromServer) 
    Return myObject 

End Function 

Antwort

0

\ r \ n sind Escape-Sequenzen, die nicht sichtbar sind, wenn eine Zeichenfolge angezeigt . Statt Ihre Daten wie diese Formatierung:

{ 
    "tester_id": 2, 
    "operation": "P" 
} 

versuchen Formatierung es so etwas wie dieses:

{"tester_id": 2,"operation": "p"}