Python y JSON: los índices de la lista TypeError deben ser enteros y no str

Estoy aprendiendo a usar Python y API (específicamente, esta API de la Copa del Mundo, http://www.kimonolabs.com/worldcup/explorer )

Los datos de JSON se ven así:

[ { "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" }, ] 

Simplemente estoy tratando de imprimir todos los primeros nombres en esta API. Esto es lo que tengo:

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

Pero cuando lo ejecuto, aparece el error “… línea 8, en … Tipo de error: los índices de lista deben ser enteros, no str”

He buscado soluciones por todas partes, pero parece que encuentro preguntas para más preguntas “en profundidad” de la API y todavía no lo entiendo todo, por lo que cualquier ayuda o explicación sobre lo que debo hacer sería increíble. ¡Gracias!

En primer lugar, debe utilizar json.loads , no json.dumps . loads convierte el texto de origen JSON a un valor de Python, mientras que los dumps van a la inversa.

Después de que arregle eso, basado en el fragmento JSON en la parte superior de su pregunta, readable_json será una lista, por lo que readable_json['firstName'] tiene sentido. La forma correcta de obtener el campo 'firstName' de cada elemento de una lista es eliminar la línea playerstuff = readable_json['firstName'] y cambiar for i in playerstuff: to for i in readable_json:

Resolví cambiando

 readable_json['firstName'] 

por

 readable_json[0]['firstName'] 

Puedes simplificar tu código hasta

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

Intentabas acceder a un elemento de la lista mediante la syntax del diccionario. el equivalente de

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

Puede ser confuso cuando tiene listas de diccionarios y mantener el agrupamiento en orden.