2015-06-21 2 views
1

В основном, что я пытаюсь сделать, это сделать программу, которая перечисляет информацию о игре для лиги легенд .. используя там API для извлечения данных. как это работает, вы ищете там имя пользователя и возвращает целое число, связанное с этой учетной записью, и затем используйте это целое число для поиска всей информации для этой учетной записи, уровня учетной записи EG, выигрышей, потерь и т. д. Я столкнулся с проблема, которую я не могу понять. Пожалуйста, не то, что я очень новичок в Json.net, поэтому у меня мало опыта работы с ней. Ниже приведен пример поиска идентификатора пользователя. Первый раздел Имя пользователя Минус Любые пробелы в имени: следующий - это идентификатор, который я требую.Visual Basic и 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 

Глядя на предыдущий пример, см. Здесь Simple working Example of json.net in VB.net

Они могут решить проблему, создав контейнерный класс со всем, что внутри него. My проблема в том, что данные, которые я ищу, я всегда меняю. Первый набор всегда будет отличаться от «Chucknoland», который показан в примере. Кто-нибудь может объяснить, как я могу извлечь эту информацию?

Обратите внимание, что переменные rRegion имеют значение того, на каком сервере он находится, Chuck Noland находится в OCE, а sSearch - это имя пользователя. Из-за проблем с ключами API мне пришлось удалить ключ API из кода. Но URL-адрес возвращает 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 

это запрос я должен получить информацию, и это код, я пытался использовать, чтобы отобразить идентификатор для этого 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 

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

+0

'Первый набор всегда ...' может быть несколько человек/предметов/пользователей, которые вам вернулись? – Plutonix

+0

@Plutonix Нет, это всегда будет один пользователь, возвращенный мне, всегда такая же информация, это только первая область, которая изменяется, при вызове имени пользователя всегда будет имя пользователя и идентификатор. Я просто не могу понять как правильно вернуть этого пользователя:/ –

ответ

1

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

Класс, который у вас есть, не совсем прав, если вы не хотите только name и id, а не всю информацию. Но использование словаря вам в любом случае не понадобится. «Трюк» - это пропустить первую часть, так как вы не знаете имя. Я могу придумать два способа сделать это, но есть, вероятно, все больше и больше способов.

Поскольку 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 

Выход:

к: идентификатор v: 273746
к: имя v: Чак Нолан
к: profileIconId v: 662
к: summonerLevel v: 30
к: 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) 

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

+0

Можете ли вы объяснить, как получить это в массив? Извините, вы меня смутили, как я сказал. Я очень новичок в Json.net .. и у меня не так много опыта в первую очередь.:/ –

+0

что сбивает с толку? Это 3 строки кода, каждый со своим собственным комментарием о том, что он делает. * why * нужно ли быть в массиве? «Словарь» - отличная коллекция и сохранит идентификатор (например, «имя») с данными – Plutonix

+0

Прошу прощения, я никогда не использовал словарь раньше. Так что я не знаком с тем, как он работает, и мне нужно часто звонить в коллекцию –