Visual Basic и веб-запрос Json.net

По сути, я пытаюсь сделать программу, которая выводит информацию об игре для League of Legends... используя API для извлечения данных. как это работает: вы ищете там имя пользователя, и оно возвращает целое число, связанное с этой учетной записью, затем вы используете это целое число для поиска всей информации об этой учетной записи, уровне учетной записи EG, выигрышах, поражениях и т. д. Я столкнулся с проблема, которую я не могу понять. Пожалуйста, не то, что я очень новичок в Json.net, поэтому у меня мало опыта работы с ним. Ниже показано, как находится поиск идентификатора пользователя. Первый раздел - это Имя пользователя минус любые пробелы в имени, затем идет идентификатор, который является необходимой мне информацией.

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

Я должен неправильно объявлять переменные, чтобы получить данные, так как все, что я делаю, возвращает 0.

это следующий класс, в котором я должен хранить идентификатор

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

Глядя на предыдущий пример, показанный здесь Простой рабочий пример json.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.

    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

Кто-нибудь может объяснить, как я могу заставить это работать?


person Donald Smith    schedule 21.06.2015    source источник
comment
The first set will always... может ли быть возвращено несколько людей/элементов/пользователей?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.06.2015
comment
@Plutonix Нет, мне всегда будет возвращаться один пользователь, всегда одна и та же информация, изменяются только первые области, при вызове имени пользователя это всегда будет имя пользователя и идентификатор .. Я просто не могу понять как заставить этого пользователя вернуться правильно:/   -  person Donald Smith    schedule 21.06.2015


Ответы (1)


Один из способов справиться с этим — поместить элемент в словарь, где ключами являются имена свойств.

Класс, который у вас есть, не совсем правильный, если только вам не нужны только name и id, а не остальная информация. Но при использовании словаря он вам все равно не понадобится. «Хитрость» заключается в том, чтобы пропустить первую часть, так как вы не знаете ее названия. Я могу придумать 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:summonerLevel v: 30
k:revDate 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)

Те же результаты.

person Ňɏssa Pøngjǣrdenlarp    schedule 21.06.2015
comment
Можете ли вы объяснить, как получить это в массив? Извините, что вы меня смутили, как я уже сказал.. Я очень новичок в Json.net.. и у меня нет такого большого опыта..:/ - person Donald Smith; 21.06.2015
comment
что смущает? Это 3 строки кода, каждая со своим комментарием о том, что она делает. почему он должен быть в массиве? Dictionary - это совершенно хорошая коллекция, и она сохранит идентификатор (например, имя) с данными. - person Ňɏssa Pøngjǣrdenlarp; 21.06.2015
comment
Прошу прощения, я никогда раньше не пользовался словарем.. Так что я не знаю, как он работает, и мне нужно часто вызывать коллекцию - person Donald Smith; 22.06.2015
comment
что вы подразумеваете под вызовом коллекции? Ссылаться на данные в нем или десериализовать многочисленные строки json? Информацию о них см. в словаре. - person Ňɏssa Pøngjǣrdenlarp; 22.06.2015