Visual basic 和 Json.net Web 请求
Visual basic and Json.net Web request
基本上我想做的是制作一个程序来列出英雄联盟的游戏信息.. 使用那里 API 来提取数据。这是如何工作的,你在那里搜索用户名,它 returns 一个链接到该帐户的整数,然后你使用该整数搜索该帐户的所有信息,EG 帐户级别,赢,输等。
我 运行 遇到了一个我似乎无法弄清楚的问题。请注意,我是 Json.net 的新手,所以使用它的经验很少。以下是搜索方式对于找到用户ID,第一部分是用户名减去名称中的任何空格接下来是ID,这是我需要的信息。
{"chucknoland":{"id":273746,"name":"Chuck Noland","profileIconId":662,"summonerLevel":30,"revisionDate":1434821021000}}
我必须声明变量错误才能获取数据,因为我所做的一切都是 returns 作为 0。
这些是以下 class 我必须将 ID 存储在
Public Class ID
Public Shared id As Integer
Public Shared name As String
End Class
查看此处看到的先前示例 Simple working Example of json.net in VB.net
他们可以通过制作一个容器 class 来解决这个问题。我的问题是我寻找的数据总是在变化。第一组总是与 "Chucknoland" 显示在示例中。有人能解释我如何提取这些信息吗?
请注意,变量 rRegion 的值是服务器上的值,Chuck Noland 在 OCE 上,sSearch 是用户名。由于 API 键出现问题,我不得不删除 API 关键代码... 但是 URL returns Json 提供。
'URL string used to grab Summoner ID
jUrlData = "https://oce.api.pvp.net/api/lol/" + rRegion + "/v1.4/summoner/by-name/" + sSearch +
' Create a request for URL Data.
Dim jsonRequest As WebRequest = WebRequest.Create(jUrlData)
'request a response from the webpage
Dim jsonResponse As HttpWebResponse = CType(jsonRequest.GetResponse(), HttpWebResponse)
'Get Data from requested URL
Dim jsonStream As Stream = jsonResponse.GetResponseStream()
'Read Steam for easy access
Dim jsonReader As New StreamReader(jsonStream)
'Read Content
Dim jsonResponseURL As String = jsonReader.ReadToEnd()
jUrlString = jsonResponseURL
这是我必须获取信息的请求,这是我试图用来显示 json 的 ID 的代码。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim obj As ID
obj = JsonConvert.DeserializeObject(Of ID)(jUrlString)
MsgBox(obj.id)
End Sub
有没有人能解释我如何才能让它发挥作用?
处理此问题的一种方法是将项目放入字典中,其中键是 属性 名称。
您的 class 不太正确,除非您只想要 name
和 id
而不是其余信息。但是无论如何使用字典你都不需要它。 "trick" 是跳过第一部分,因为你不知道名字。我可以想到 2 种方法来做到这一点,但可能有 more/better 种方法。
由于 json 大量使用字符串键,创建一个字典,然后从中获取实际项目的数据:
jstr = ... from whereever
' create a dictionary
Dim jResp = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jstr)
' get the first/only value item
Dim jobj = jResp.Values(0) ' only 1 item
' if you end up needing the name/key:
'Dim key As String = jResp.Keys(0)
' deserialize first item to dictionary
Dim myItem = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jobj.ToString)
' view results
For Each kvp As KeyValuePair(Of String, Object) In myItem
Console.WriteLine("k: {0} v: {1}", kvp.Key, kvp.Value.ToString)
Next
输出:
k: id v: 273746
k: name v: Chuck Noland
k: profileIconId v: 662
k: summonerLevel v: 30
k: revisionDate v: 1434821021000
使用 String, String
也可能有效,但它会将数字转换为字符串(30
变为 "30"
),这通常是不可取的。
在四处寻找时,我发现了另一种获取对象数据的方法,但我不确定这是否是个好主意:
' parse to JObject
Dim js As JObject = JObject.Parse(jstr)
' 1 = first item; 2+ will be individual props
Dim jT As JToken = js.Descendants(1)
' parse the token to String/Object pairs
Dim myItem = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jT.ToString)
相同的结果。
基本上我想做的是制作一个程序来列出英雄联盟的游戏信息.. 使用那里 API 来提取数据。这是如何工作的,你在那里搜索用户名,它 returns 一个链接到该帐户的整数,然后你使用该整数搜索该帐户的所有信息,EG 帐户级别,赢,输等。 我 运行 遇到了一个我似乎无法弄清楚的问题。请注意,我是 Json.net 的新手,所以使用它的经验很少。以下是搜索方式对于找到用户ID,第一部分是用户名减去名称中的任何空格接下来是ID,这是我需要的信息。
{"chucknoland":{"id":273746,"name":"Chuck Noland","profileIconId":662,"summonerLevel":30,"revisionDate":1434821021000}}
我必须声明变量错误才能获取数据,因为我所做的一切都是 returns 作为 0。
这些是以下 class 我必须将 ID 存储在
Public Class ID
Public Shared id As Integer
Public Shared name As String
End Class
查看此处看到的先前示例 Simple working Example of json.net in VB.net
他们可以通过制作一个容器 class 来解决这个问题。我的问题是我寻找的数据总是在变化。第一组总是与 "Chucknoland" 显示在示例中。有人能解释我如何提取这些信息吗?
请注意,变量 rRegion 的值是服务器上的值,Chuck Noland 在 OCE 上,sSearch 是用户名。由于 API 键出现问题,我不得不删除 API 关键代码... 但是 URL returns Json 提供。
'URL string used to grab Summoner ID
jUrlData = "https://oce.api.pvp.net/api/lol/" + rRegion + "/v1.4/summoner/by-name/" + sSearch +
' Create a request for URL Data.
Dim jsonRequest As WebRequest = WebRequest.Create(jUrlData)
'request a response from the webpage
Dim jsonResponse As HttpWebResponse = CType(jsonRequest.GetResponse(), HttpWebResponse)
'Get Data from requested URL
Dim jsonStream As Stream = jsonResponse.GetResponseStream()
'Read Steam for easy access
Dim jsonReader As New StreamReader(jsonStream)
'Read Content
Dim jsonResponseURL As String = jsonReader.ReadToEnd()
jUrlString = jsonResponseURL
这是我必须获取信息的请求,这是我试图用来显示 json 的 ID 的代码。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim obj As ID
obj = JsonConvert.DeserializeObject(Of ID)(jUrlString)
MsgBox(obj.id)
End Sub
有没有人能解释我如何才能让它发挥作用?
处理此问题的一种方法是将项目放入字典中,其中键是 属性 名称。
您的 class 不太正确,除非您只想要 name
和 id
而不是其余信息。但是无论如何使用字典你都不需要它。 "trick" 是跳过第一部分,因为你不知道名字。我可以想到 2 种方法来做到这一点,但可能有 more/better 种方法。
由于 json 大量使用字符串键,创建一个字典,然后从中获取实际项目的数据:
jstr = ... from whereever
' create a dictionary
Dim jResp = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jstr)
' get the first/only value item
Dim jobj = jResp.Values(0) ' only 1 item
' if you end up needing the name/key:
'Dim key As String = jResp.Keys(0)
' deserialize first item to dictionary
Dim myItem = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jobj.ToString)
' view results
For Each kvp As KeyValuePair(Of String, Object) In myItem
Console.WriteLine("k: {0} v: {1}", kvp.Key, kvp.Value.ToString)
Next
输出:
k: id v: 273746
k: name v: Chuck Noland
k: profileIconId v: 662
k: summonerLevel v: 30
k: revisionDate v: 1434821021000
使用 String, String
也可能有效,但它会将数字转换为字符串(30
变为 "30"
),这通常是不可取的。
在四处寻找时,我发现了另一种获取对象数据的方法,但我不确定这是否是个好主意:
' parse to JObject
Dim js As JObject = JObject.Parse(jstr)
' 1 = first item; 2+ will be individual props
Dim jT As JToken = js.Descendants(1)
' parse the token to String/Object pairs
Dim myItem = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(jT.ToString)
相同的结果。