Python和JSON-TypeError列表索引必须是整数而不是str

Python和JSON-TypeError列表索引必须是整数而不是str,python,json,Python,Json,我正在学习使用Python和API(特别是这个世界杯API) JSON数据如下所示: [ { "firstName": "Nicolas Alexis Julio", "lastName": "N'Koulou N'Doubena", "nickname": "N. N'Koulou", "assists": 0, "clubId": "5AF524A1-830C-4D75-8C54-2D0BA1F9BE33", "teamId": "DF25

我正在学习使用Python和API(特别是这个世界杯API)

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行,在…TypeError中:列表索引必须是整数,而不是str”


我环顾四周寻找解决方案,但似乎找到了更多“深入”API问题的问题,我还没有真正理解所有问题,因此任何关于我需要做什么的帮助或解释都将是令人惊讶的。谢谢大家!

首先,您应该使用
json.loads
,而不是
json.dumps
加载
将JSON源文本转换为Python值,而
转储
则相反


在您解决了这个问题之后,根据问题顶部的JSON片段,
readable_JSON
将是一个列表,因此
readable_JSON['firstName']
毫无意义。获取列表中每个元素的
'firstName'
字段的正确方法是删除
playerstuff=readable\u json['firstName']
行,并将playerstuff:中的i更改为
中的i\u json:
您可以将代码简化为

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"]
当你有字典列表并且保持嵌套有序时,这可能会让人困惑

我解决了改变

readable_json['firstName']


啊哈!谢谢你的解释,这就成功了。现在,为了贪心,我怎么能在名字旁边用空格打印“lastName”?如果你对python和API教程(从简单开始)有任何建议,我洗耳恭听!谢谢你的帮助@user3718365:
打印i['firstName',i['lastName']
谢谢!最后一个问题是:如果我想列出所有可能的键(例如:firstName、lastName、age等),这样用户就可以键入他们想要查看的内容,我将如何返回键列表(这是正确的单词)?另外,我是StackOverflow的新手,如果我不应该在问题上添加问题,我非常抱歉。@user3718365:你不应该在问题上添加问题,但你的第一个额外问题很琐碎,我心情很好。获取密钥列表的最简单方法是
可读的\u json[0]。keys()
,但这假设列表中的每个元素都有相同的密钥集,这并不总是正确的。
可读的\u json=json.loads(json\u obj)[0]
的缺点是什么?谢谢你的帮助。非常感谢。这只是一些常见的python智慧-请求库通常是使用urllib2的更好的替代方案。我将查看它,谢谢!除了url,我不能不读取类似以下内容:@app.route('/test',methods=['GET','POST'])def foo():json_obj=request.json readable_json=json.loads(json_obj)for i in readable_json:print i['firstName']如果我这样做,我会得到TypeError:expected string或bufferhi=json.dumps(['foo',{'bar':('baz',None,1.0,2)})ji=json.loads(hi),ji[0][“foo”]回溯(最近一次调用):文件“”,第1行,在TypeError中:字符串索引必须是整数
readable_json[0]['firstName']