【问题标题】:Visual basic and Json.net Web requestVisual Basic 和 Json.net Web 请求
【发布时间】:2015-09-06 23:00:25
【问题描述】:

基本上,我想做的是制作一个程序,列出英雄联盟的游戏信息。使用那里的 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

有人能解释我如何才能让它工作吗?

【问题讨论】:

  • The first set will always... 可以有多个人/项目/用户返回给你吗?
  • @Plutonix 不,它总是返回给我的单个用户,总是相同的信息,它只是第一个区域被更改,调用用户名时它总是用户名和 ID。 . 我只是不知道如何让该用户正确返回:/

标签: asp.net json vb.net basic


【解决方案1】:

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

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

由于 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: 姓名 v: Chuck Noland
k: profileIconId v: 662
k: 召唤师等级 v: 30
k: 修订日期 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)

同样的结果。

【讨论】:

  • 你能解释一下如何把它放入一个数组中吗?对不起,你让我感到困惑,就像我说的那样。我对 Json.net 很陌生。我一开始没有那么多经验。:/
  • 什么令人困惑?它是 3 行代码,每行都有自己的注释说明它的作用。 为什么它需要在一个数组中? Dictionary 是一个非常好的集合,并且会将标识符(例如“名称”)与数据一起保存
  • 抱歉,我以前从未使用过 Dictionary.. 所以我不熟悉它的工作原理,我需要经常调用该集合
  • 调用集合是什么意思?引用其中的数据还是反序列化大量的 json 字符串?有关它们的信息,请参阅Dictionary
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多