vb.net 如何使用VB读取JSON http post响应
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15979742/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to read JSON http post response using VB
提问by razz
I have the following code, it connects to PHP server and retrieve data successfully, i'm not very good with VB, how can i read the JSON response text and extract it's elements?
我有以下代码,它连接到 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
The JSON response would be something like:
JSON 响应类似于:
{"comments": [
{
"comment" : "some text",
"date" : "some date",
"user" : "user name"
},
{
"comment" : "some text",
"date" : "some date",
"user" : "user name"
}
],
"messages": [ .... ]
}
How to output the json string into:
如何将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
回答by razz
After long research and many tests I found out a very nice extension called Newtonsoft.json
, it's extremely simple and can be installed from package manager console
like this:
经过长时间的研究和多次测试,我发现了一个非常好的扩展名为Newtonsoft.json
,它非常简单,可以package manager console
像这样安装:
install-package Newtonsoft.json
And include it like this:
并像这样包含它:
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Then all i needed to do is to declare the elements names and values like this:
然后我需要做的就是像这样声明元素名称和值:
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
hope someone will find this useful
希望有人会发现这很有用
回答by Rogala
@razzak is absolutely right to use the Json.Net NuGet package. Another option that would cut this down dramatically, is to use the built in DeserializeObject function. As long as you have a well define model, then you can deserialize the Json right into an instance of the object using something like this:
@razzak 使用 Json.Net NuGet 包是绝对正确的。另一个可以显着减少这种情况的选择是使用内置的 DeserializeObject 函数。只要您有一个明确定义的模型,您就可以使用如下方式将 Json 反序列化为对象的实例:
dim myObject as MyDefinedObject = JsonConvert.DeserializeObject(responseFromServer)
or this in C#
或在 C# 中
MyDefinedObject m = JsonConvert.DeserializeObject<MyDefinedObject>(responseFromServer);
Also, if you don't want to loop, you could also select tokens using something like this:
此外,如果您不想循环,您还可以使用以下内容选择令牌:
Dim d = ser.SelectToken("$..resources[?(@)].travelDistance")
This code above was used to locate the travelDistance between two points from the Bing API. If you have ever dealt with the Bing or Google Map REST APIs, then you know the JSon is generally too large to loop through the data when you are looking for very specific values.
上面的代码用于通过 Bing API 定位两点之间的 travelDistance。如果您曾经使用过 Bing 或 Google Map REST API,那么您就会知道 JSon 通常太大而无法在您寻找非常具体的值时遍历数据。
I hope this is helpful for anyone looking to do something like this. The JSon.Net website has a blog page that goes through some additional examples.
我希望这对任何想要做这样的事情的人都有帮助。JSon.Net 网站有一个博客页面,其中包含一些其他示例。
http://james.newtonking.com/json
http://james.newtonking.com/json
~Cheers
~干杯
回答by msl
To use
使用
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
'Json.Net' library should be installed.
应该安装“Json.Net”库。
回答by Jason
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
This seems to cut it on VB.net for youtube API V.3
of course it depends on what you are trying to accomplish
but Youtube returns data as Json format
这似乎在 VB.net 上针对 youtube API V.3 进行了切割
,当然这取决于您要完成的工作,但 Youtube 以 Json 格式返回数据