Visual basic and Json.net Web request

2.3k views Asked by At

Basically what im trying to do is make a program that list game information for league of legends.. using there API to extract data. how this works is you Search there username and it returns an integer linked to that account, you then use that integer to search for all of the information for that account, EG account level, wins, losses, etc. I've run into a problem i can't seem to figure out.. Please not that I'm very new to Json.net so have little experience about working with it.. Below is how the search for the user ID is found, The First section is the Username Minus Any spaces in the name the next is the ID which is the information i require.

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

I must be declaring the variables wrong in order to obtain the data as everything i do it returns as 0.

these are the following class i have to store the ID within

    Public Class ID
    Public Shared id As Integer
    Public Shared name As String
End Class

Looking at a previous example seen here Simple working Example of json.net in VB.net

They where able to resolve there issue by making a container class with everything inside it.. My problem is that The data i seek i always changing.. The first set will always be different to the "Chucknoland" that's displayed in the example.. is someone able to explain how i could go about extracting this information?

Please note that the variables rRegion has the value of what server there on, Chuck Noland is on OCE, and sSearch is the Username.. Due to Problems with API keys i had to remove the API key from the code... But the URL returns the Json Provided.

 '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

this is the request i have to obtain the information, and this is the code i tried to use to display the ID for that json.

    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

Is anyone able to explain how i can go about getting this to work?

1

There are 1 answers

4
Ňɏssa Pøngjǣrdenlarp On BEST ANSWER

One way to handle this would be to get the item into a Dictionary where the keys are the property names.

The class you have is not quite right unless you only want name and id and not the rest of the information. But using a Dictionary you wont need it anyway. The "trick" is to skip over the first part since you do not know the name. I can think of 2 ways to do this, but there are probably more/better ways.

Since json uses string keys pretty heavily, create a Dictionary, then get the data from it for the actual item:

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

Output:

k: id v: 273746
k: name v: Chuck Noland
k: profileIconId v: 662
k: summonerLevel v: 30
k: revisionDate v: 1434821021000

Using String, String may also work, but it would convert numerics to string (30 becomes "30") which is usually undesirable.

While poking around I found another way to get at the object data, but I am not sure if it is a good idea or not:

' 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)

Same results.