我正在学习使用Python和API(特别是这个世界杯API,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"
},
]
Run Code Online (Sandbox Code Playgroud)
我只是想在这个API中打印所有firstNames.这就是我所拥有的:
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']
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我得到错误"......第8行,在...... TypeError:列表索引必须是整数,而不是str"
我已经四处寻找解决方案,但似乎在更深入的"API"问题中找到了问题,我还没有完全理解它,所以对我需要做的任何帮助或解释都会很棒.谢谢!
jwo*_*der 22
首先,你应该使用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:.
小智 21
我解决了改变
readable_json['firstName']
Run Code Online (Sandbox Code Playgroud)
通过
readable_json[0]['firstName']
Run Code Online (Sandbox Code Playgroud)
您可以将代码简化为
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']
Run Code Online (Sandbox Code Playgroud)
您试图使用字典语法访问列表元素。相当于
foo = [1, 2, 3, 4]
foo["1"]
Run Code Online (Sandbox Code Playgroud)
当您有字典列表并保持嵌套顺序时,这可能会令人困惑。