Индексы списка Python и JSON - TypeError должны быть целыми, а не str

Я изучаю использование Python и API (в частности, этот API World Cup, http://www.kimonolabs.com/worldcup/explorer)

Данные JSON выглядят следующим образом:

[
  {
    "firstName": "Nicolas Alexis Julio",
    "lastName": "N'Koulou N'Doubena",
    "nickname": "N. N'Koulou",
    "assists": 0,
    "clubId": "5AF524A1-830C-4D75-8C54-2D0BA1F9BE33",
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D",
    "id": "D9AD1E6D-4253-4B88-BB78-0F43E02AF016",
    "type": "Player"
  },

 {
    "firstName": "Alexandre Dimitri",
    "lastName": "Song-Billong",
    "nickname": "A. Song",
    "clubId": "35BCEEAF-37D3-4685-83C4-DDCA504E0653",
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D",
    "id": "A84540B7-37B6-416F-8C4D-8EAD55D113D9",
    "type": "Player"
  },
   ]

Я просто пытаюсь напечатать все первые имена в этом API. Вот что у меня есть:

import urllib2
import json

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx"
json_obj = urllib2.urlopen(url).read
readable_json = json.dumps(json_obj)
playerstuff = readable_json['firstName']
for i in playerstuff:
    print i['firstName']

Но когда я запускаю его, я получаю сообщение об ошибке "... строка 8, в... ТипError: индексы списка должны быть целыми, а не str"

Я искал решения, но, похоже, нахожу вопросы для более "углубленных" вопросов API, и я пока не понимаю их все, поэтому любая помощь или объяснение того, что мне нужно сделать, было бы потрясающе. Спасибо!

Ответ 1

Прежде всего, вы должны использовать json.loads, а не json.dumps. loads преобразует исходный текст JSON в значение Python, а dumps переходит в другую сторону.

После того, как вы исправите это, на основе фрагмента JSON в верхней части вашего вопроса, readable_json будет списком, и поэтому readable_json['firstName'] не имеет смысла. Правильный способ получить поле 'firstName' для каждого элемента списка - удалить строку playerstuff = readable_json['firstName'] и изменить for i in playerstuff: на for i in readable_json:.

Ответ 2

Я решил изменить

readable_json['firstName']

по

readable_json[0]['firstName']

Ответ 3

Вы можете упростить код до

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx"
json_obj = urllib2.urlopen(url).read
player_json_list = json.loads(json_obj)
for player in readable_json_list:
    print player['firstName']

Вы пытались получить доступ к элементу списка, используя синтаксис словаря. эквивалент

foo = [1, 2, 3, 4]
foo["1"]

Это может сбивать с толку, когда у вас есть списки словарей и соблюдение порядка вложенности.