Как читать ответ JSON http post с помощью VB

У меня есть следующий код: он подключается к серверу PHP и извлекает данные успешно, я не очень хорошо разбираюсь в VB, как я могу прочитать текст ответа JSON и извлечь его?

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

Ответ JSON будет примерно таким:

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

Как вывести строку json в:

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

Ответ 1

После долгих исследований и многих тестов я обнаружил очень приятное расширение под названием Newtonsoft.json, оно очень простое и может быть установлено из package manager console следующим образом:

install-package Newtonsoft.json

И включите его вот так:

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Тогда все, что мне нужно сделать, - объявить имена элементов и их значения следующим образом:

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

надеюсь, что кто-то найдет это полезным

Ответ 2

@razzak абсолютно прав на использование пакета Json.Net NuGet. Другим вариантом, который резко сократил бы это, является использование встроенной функции DeserializeObject. Пока у вас есть хорошо определенная модель, вы можете десериализовать Json прямо в экземпляр объекта, используя что-то вроде этого:

dim myObject as MyDefinedObject = JsonConvert.DeserializeObject(responseFromServer)

или это в С#

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

Кроме того, если вы не хотите использовать цикл, вы также можете выбрать маркеры, используя что-то вроде этого:

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

Этот код был использован для определения расстояния между двумя точками от Bing API. Если вы когда-либо обращались с API REST Bing или Google Map, то вы знаете, что JSon, как правило, слишком велик, чтобы перебирать данные, когда вы ищете очень конкретные значения.

Надеюсь, это полезно для тех, кто хочет сделать что-то подобное. На веб-сайте JSon.Net есть страница блога, которая содержит некоторые дополнительные примеры.

http://james.newtonking.com/json

~ Приветствия

Ответ 3

Чтобы использовать

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Библиотека

'Json.Net' должна быть установлена.

screenshot

Ответ 4

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Кажется, это сократило его на VB.net для API youtube V.3
конечно, это зависит от того, что вы пытаетесь выполнить но Youtube возвращает данные как формат Json