Visual Basic和Json.net Web请求

时间:2015-06-21 11:19:02

标签: asp.net json vb.net basic

基本上我试图做的是制作一个程序,列出传说联盟的游戏信息..使用API​​提取数据。这是如何工作的你搜索用户名并返回一个链接到该帐户的整数,然后使用该整数搜索该帐户的所有信息,EG帐户级别,胜利,损失等。 我遇到了一个我似乎无法弄清楚的问题..请注意,我不是Json.net的新手所以对使用它有一点经验..以下是如何找到用户ID的搜索,第一部分是用户名减号名称中的任何空格下一个是ID,这是我需要的信息。

{"chucknoland":{"id":273746,"name":"Chuck Noland","profileIconId":662,"summonerLevel":30,"revisionDate":1434821021000}}

我必须声明变量是错误的,以便获取数据,因为我所做的一切都返回为0.

这些是以下类,我必须将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

他们能够通过制作一个包含其中所有内容的容器类来解决这个问题。我的问题是我寻求的数据总是在改变..第一组总是与“Chucknoland”不同,它显示在例如..有人能够解释我如何提取这些信息吗?

请注意,变量rRegion具有其中的服务器的值,Chuck Noland在OCE上,sSearch是用户名。由于API密钥问题,我不得不从代码中删除API密钥...但是URL返回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

有人能够解释我如何才能让它发挥作用吗?

1 个答案:

答案 0 :(得分:1)

处理此问题的一种方法是将项目放入字典中,其中键是属性名称。

除非您只想要nameid而不是其他信息,否则您所拥有的课程并不完全正确。但是使用字典你无论如何都不需要它。 “技巧”是跳过第一部分,因为你不知道名字。我可以想到两种方法,但可能有更多/更好的方法。

由于json使用了相当多的字符串键,因此创建一个Dictionary,然后从中获取实际项目的数据:

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:名字v:Chuck Noland
  k:profileIconId v:662
  k:召唤者等级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)

相同的结果。