2013-04-12 6 views
10

Ich habe den folgenden Code, es verbindet sich mit PHP-Server und Daten erfolgreich abrufen, ich bin nicht sehr gut mit VB, wie kann ich den JSON-Antworttext lesen und extrahieren es Elemente?Wie zu lesen JSON http Post Antwort mit VB

Public Class Form1 
    Private Sub submit_Click(sender As System.Object, e As System.EventArgs) Handles submit.Click 
     Dim user As String 
     Dim pass As String 
     user = uname.Text 
     pass = passwd.Text 

     Dim request As WebRequest = WebRequest.Create("http://domain.com/test.php") 
     request.Method = "POST" 
     Dim postData As String 
     postData = "username=" & user & "&password=" & pass 
     Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData) 
     request.ContentType = "application/x-www-form-urlencoded" 
     request.ContentLength = byteArray.Length 
     Dim dataStream As Stream = request.GetRequestStream() 
     dataStream.Write(byteArray, 0, byteArray.Length) 
     dataStream.Close() 
     Dim response As WebResponse = request.GetResponse() 
     Console.WriteLine(CType(response, HttpWebResponse).StatusDescription) 
     dataStream = response.GetResponseStream() 
     Dim reader As New StreamReader(dataStream) 
     Dim responseFromServer As String = reader.ReadToEnd() 
     If responseFromServer = "0" Then 
      MsgBox("Login Failed") 
     Else 
      MsgBox("json data") 
     End If 
     reader.Close() 
     dataStream.Close() 
     response.Close() 
    End Sub 
End Class 

Die JSON Antwort wäre so etwas wie:

{"comments": [ 
       { 
       "comment" : "some text", 
       "date" : "some date", 
       "user" : "user name" 
       }, 
       { 
       "comment" : "some text", 
       "date" : "some date", 
       "user" : "user name" 
       } 
      ], 
"messages": [ .... ] 
} 

Wie der JSON-String zur Ausgabe in:

Comments 
user  date  comment 
----------------------------------- 
user 1 date 1 comment 1 
user 2 date 2 comment 2 

Messages 
user  date  message 
----------------------------------- 
user 1 date 1 message 1 
user 2 date 2 message 2 
+2

Erstellen Sie ein Objekt, das die Struktur des JSON übereinstimmt und deserialisieren es. Schauen Sie sich diesen Beitrag an: http://StackOverflow.com/Questions/8118019/vb-net-json-deserialize –

+0

Ich bin mir nicht sicher, ob ich weiß, was ich mache, aber es sagt 'System.Runtime.Serialization.Json.DataContractJsonSerializer (data.GetType()) 'ist nicht definiert, wenn ich Dim ser als New System.Runtime.Serialization.Json.DataContractJsonSerializer (data.GetType())'! Warum ist das so? – razzak

+0

Geringe Empfehlung, wenn ich Objekte (Streams, Webresponse) erzeuge, die IDisposable implementieren, würde ich empfehlen, sie in eine using-Anweisung zu packen. – Rogala

Antwort

20

Nach langer Forschung und viele Tests, die ich eine sehr schöne Erweiterung fand heraus, genannt Newtonsoft.json, es ist extrem einfach und kann von wie folgt installiert werden:

install-package Newtonsoft.json 

Und sind es wie folgt aus:

Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 

Dann alles, was ich tun musste, ist es, die Elemente Namen und Werte wie folgt zu erklären:

Else 
    Dim json As String = responseFromServer 
    Dim ser As JObject = JObject.Parse(json) 
    Dim data As List(Of JToken) = ser.Children().ToList 
    Dim output As String = "" 

    For Each item As JProperty In data 
     item.CreateReader() 
     Select Case item.Name 
      Case "comments" 
       output += "Comments:" + vbCrLf 
       For Each comment As JObject In item.Values 
        Dim u As String = comment("user") 
        Dim d As String = comment("date") 
        Dim c As String = comment("comment") 
        output += u + vbTab + d + vbTab + c + vbCrLf 
       Next 

      Case "messages" 
       output += "Messages:" + vbCrLf 
       For Each msg As JObject In item.Values 
        Dim f As String = msg("from") 
        Dim t As String = msg("to") 
        Dim d As String = msg("date") 
        Dim m As String = msg("message") 
        Dim s As String = msg("status") 
        output += f + vbTab + t + vbTab + d + vbTab + m + vbTab + s + vbCrLf 
       Next 

     End Select 
    Next 
    MsgBox(output) 
End If 

Hoffnung jemand wird diese nützliche

finden
5

@razzak ist absolut richtig, das Json.Net NuGet-Paket zu verwenden. Eine andere Option, die dies drastisch reduzieren würde, ist die eingebaute DeserializeObject-Funktion. Solange Sie ein gut definieren Modell haben, dann können Sie die Json rechts in eine Instanz des Objekts mit so etwas wie dies deserialisieren:

dim myObject as MyDefinedObject = JsonConvert.DeserializeObject(responseFromServer) 

oder dies in C#

MyDefinedObject m = JsonConvert.DeserializeObject<MyDefinedObject>(responseFromServer); 

Auch, wenn Sie wollen nicht Schleife, können Sie auch Token wählen etwas wie folgt aus:

Dim d = ser.SelectToken("$..resources[?(@)].travelDistance") 

Dieser Code oben verwendet wurde, die travelDistance zwischen zwei Punkten von der Bing-API zu lokalisieren. Wenn Sie sich jemals mit den Bing- oder Google Map-REST-APIs beschäftigt haben, wissen Sie, dass der JSon im Allgemeinen zu groß ist, um die Daten zu durchlaufen, wenn Sie nach sehr spezifischen Werten suchen.

Ich hoffe, das ist hilfreich für jeden, der etwas wie das zu tun sucht. Die JSon.Net-Website enthält eine Blog-Seite, die einige zusätzliche Beispiele durchläuft.

http://james.newtonking.com/json

~ Prost

0
Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 

Das auf VB.net für youtube API V.3
natürlich zu schneiden scheint es hängt davon ab, was Sie versuchen zu erreichen, aber Youtube gibt Daten als Json-Format

2

zurück, um

zu verwenden
Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 

Die Json.Net-Bibliothek sollte installiert sein.

screenshot

+0

Dies sollte ein Kommentar sein, keine Antwort. –

Verwandte Themen