web-dev-qa-db-fra.com

Comment lire JSON http post response en utilisant VB

J'ai le code suivant, il se connecte au serveur PHP et récupère les données avec succès, je ne suis pas très bon avec VB, comment puis-je lire le texte de réponse JSON et extraire ses éléments?

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

La réponse JSON serait quelque chose comme:

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

Comment sortir la chaîne json dans:

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
12
razzak

Après de longues recherches et de nombreux tests, j'ai découvert une très jolie extension appelée Newtonsoft.json, extrêmement simple et pouvant être installée à partir de package manager console comme ceci:

install-package Newtonsoft.json

Et l'inclure comme ceci:

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Il ne me restait plus qu'à déclarer les noms et les valeurs des éléments comme ceci:

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

j'espère que quelqu'un trouvera cela utile

22
razzak

@razzak a absolument raison d'utiliser le package Json.Net NuGet. Une autre option qui permettrait de réduire considérablement cette situation consiste à utiliser la fonction DeserializeObject intégrée. Tant que vous avez un modèle bien défini, vous pouvez alors désérialiser le Json dans une instance de l'objet en utilisant quelque chose comme:

dim myObject as MyDefinedObject = JsonConvert.DeserializeObject(responseFromServer)

ou ceci en C #

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

De plus, si vous ne voulez pas faire de boucle, vous pouvez aussi sélectionner des jetons en utilisant quelque chose comme:

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

Ce code ci-dessus a été utilisé pour localiser la distance de déplacement entre deux points de l'API Bing. Si vous avez déjà utilisé les API Bing ou Google Map REST, vous savez que JSon est généralement trop volumineux pour parcourir les données lorsque vous recherchez des valeurs très spécifiques. 

J'espère que cela est utile pour quiconque cherche à faire quelque chose comme ça. Le site Web JSon.Net a une page de blog qui passe en revue quelques exemples supplémentaires.

http://james.newtonking.com/json

~ A bientôt

6
Rogala

Utiliser 

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

La bibliothèque 'Json.Net' doit être installée.

screenshot

2
msl
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Cela semble le couper sur VB.net pour youtube API V.3
Bien sûr, cela dépend de ce que vous voulez accomplir mais Youtube renvoie les données au format Json

0
Jason