2016-11-24 2 views
1

В настоящее время я работаю над проектом, который включает в себя получение данных из API RiotGames и будет предлагать некоторую помощь в этой проблеме, которую я, похоже, не могу решить.Как я могу назвать конкретные данные json?

Код:

import requests 
r = requests.get(url="https://na.api.pvp.net/api/lol/na/v1.3/stats/by-summoner/7250/ranked?season=SEASON2016&api_key=ABC420") 
json_data = r.json() 
get_summoner_data = (json_data["champions"]) 
print(get_summoner_data) 

И это является ответом

{"summonerId":7250,"modifyDate":1479970436000,"champions":[{"id":111,"stats":{"totalSessionsPlayed":2,"totalSessionsLost":2,"totalSessionsWon":0,"totalChampionKills":8,"totalDamageDealt":211063,"totalDamageTaken":42772,"mostChampionKillsPerSession":7,"totalMinionKills":318,"totalDoubleKills":1,"totalTripleKills":0,"totalQuadraKills":0,"totalPentaKills":0,"totalUnrealKills":0,"totalDeathsPerSession":15,"totalGoldEarned":21574,"mostSpellsCast":0,"totalTurretsKilled":1,"totalPhysicalDamageDealt":33376,"totalMagicDamageDealt":174433,"totalFirstBlood":0,"totalAssists":11,"maxChampionsKilled":7,"maxNumDeaths":8}},{"id":110,"stats":{"totalSessionsPlayed":3,"totalSessionsLost":3,"totalSessionsWon":0,"totalChampionKills":12,"totalDamageDealt":463303,"totalDamageTaken":49704,"mostChampionKillsPerSession":8,"totalMinionKills":675,"totalDoubleKills":0,"totalTripleKills":0,"totalQuadraKills":0,"totalPentaKills":0,"totalUnrealKills":0,"totalDeathsPerSession":15,"totalGoldEarned":35203,"mostSpellsCast":0,"totalTurretsKilled":2,"totalPhysicalDamageDealt":438295,"totalMagicDamageDealt":22391,"totalFirstBlood":0,"totalAssists":28,"maxChampionsKilled":8,"maxNumDeaths":6}} 

Так respone в основном данные производительности игроков с различными чемпионами, в этом случае, определяемом их идентификаторами.

Но скажем, кто-то играет в чемпиона с идентификатором 111, теперь я хочу, чтобы все данные были подключены к этому идентификатору, а затем можно распечатать определенные части, например: MaxDeaths и MaxGold.

Но если данных для этого идентификатора не найдено, у меня было бы сообщение типа «Данные не найдены».

Как вы можете видеть здесь, есть данные для идентификатора чемпиона 111, но как я могу позвонить, чтобы получить только эти данные?

Боковое примечание для лучшего понимания: Игрок находится в игре с 10 другими игроками, по 5 на каждую команду. Каждый человек играет разных чемпионов. Я хочу посмотреть, имеет ли игрок какой-либо предшествующий опыт с этим чемпионом (все эти данные), и поэтому проверяет, находится ли идентификатор чемпиона в сводке. Если это так, я буду использовать эти данные, чтобы провести какой-то анализ производительности.

ответ

0
for i in json_data["champions"]: 
    if i["id"]=="111": 
    print("found") 
    print(i["stats"]["maxNumDeaths"]) 
else: 
    print("not found") 
+0

Большое спасибо! Один последний вопрос, как бы я пошел, если бы хотел напечатать больше, чем просто maxNumDeaths, ex print (i ['stats'] ["maxNumDeaths"] ["totalSessionsWon"]) дает мне TypeError "int" объект не подстрочный номер " –

+0

, вы не можете вызывать' print (i ["stats"] ["maxNumDeaths"] ["totalSessionsWon"]) ', потому что такого узла нет. если вы хотите «totalSessionsWon», вы можете вызвать «print (i [" stats "] [" totalSessionsWon "]' –

0

Таким образом, есть много решений, вы можете сделать что-то вроде этого:

def get_champion_info(data, id): 
    champions = [c for c in data if c['id'] == id] 
    if len(champions): 
     return champions[0] 
    return "Data not found" 

champion_info = get_champion_info(json_data["champions"], 111) 

Но это не является хорошим решением для возвращения различных типов данных (строки и Dict от одной функции)

0

В API documentation, есть метод, который я думаю, что ответ на ваш вопрос:

GET /api/lol/{region}/v1.2/champion/{id} 

Так что я думаю, что вы могли бы сделать:

r = requests.get(url="https://na.api.pvp.net/api/lol/na/v1.3/champion/{id}") 

Конечно, поставить чемпиона идентификатор и ключ API.

Смежные вопросы