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 不太正确,除非您只想要 nameid 而不是其余信息。但是无论如何使用字典你都不需要它。 "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)

相同的结果。