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

时间:2021-09-05 17:08:30

I am learning to use Python and APIs (specifically, this World Cup API, http://www.kimonolabs.com/worldcup/explorer)

我正在学习使用Python和API(特别是这个世界杯API,http://www.kimonolabs.com/worldcup/explorer)

The JSON data looks like this:

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

I am simply trying to print all of the firstNames in this API. Here's what I have:

我只是想在这个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']

But when I run it, I get the error "...line 8, in ...TypeError: list indices must be integers, not str"

但是当我运行它时,我得到错误“......第8行,在...... TypeError:列表索引必须是整数,而不是str”

I have looked around for solutions, but seem to find questions to more "in depth" API questions and I don't really understand it all yet, so any help or explanation as to what I need to do would be amazing. Thank you!

我已经四处寻找解决方案,但似乎在更深入的“API”问题上找到了问题,我还没有完全理解它,所以对我需要做的任何帮助或解释都会很棒。谢谢!

3 个解决方案

#1


18  

First of all, you should be using json.loads, not json.dumps. loads converts JSON source text to a Python value, while dumps goes the other way.

首先,你应该使用json.loads,而不是json.dumps。 load将JSON源文本转换为Python值,而转储则转向另一种方式。

After you fix that, based on the JSON snippet at the top of your question, readable_json will be a list, and so readable_json['firstName'] is meaningless. The correct way to get the 'firstName' field of every element of a list is to eliminate the playerstuff = readable_json['firstName'] line and change for i in playerstuff: to for i in readable_json:.

修复之后,基于问题顶部的JSON片段,readable_json将是一个列表,因此readable_json ['firstName']毫无意义。获取列表中每个元素的'firstName'字段的正确方法是消除playerstuff = readable_json ['firstName']行,并在playertuff中为i更改:to read in read_json:。

#2


15  

I solved changing

我解决了改变

readable_json['firstName']

by

通过

readable_json[0]['firstName']

#3


3  

You can simplify your code down to

您可以将代码简化为

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

You were trying to access a list element using dictionary syntax. the equivalent of

您试图使用字典语法访问列表元素。相当于

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

It can be confusing when you have lists of dictionaries and keeping the nesting in order.

当你有字典列表并保持嵌套顺序时,可能会让人感到困惑。

#1


18  

First of all, you should be using json.loads, not json.dumps. loads converts JSON source text to a Python value, while dumps goes the other way.

首先,你应该使用json.loads,而不是json.dumps。 load将JSON源文本转换为Python值,而转储则转向另一种方式。

After you fix that, based on the JSON snippet at the top of your question, readable_json will be a list, and so readable_json['firstName'] is meaningless. The correct way to get the 'firstName' field of every element of a list is to eliminate the playerstuff = readable_json['firstName'] line and change for i in playerstuff: to for i in readable_json:.

修复之后,基于问题顶部的JSON片段,readable_json将是一个列表,因此readable_json ['firstName']毫无意义。获取列表中每个元素的'firstName'字段的正确方法是消除playerstuff = readable_json ['firstName']行,并在playertuff中为i更改:to read in read_json:。

#2


15  

I solved changing

我解决了改变

readable_json['firstName']

by

通过

readable_json[0]['firstName']

#3


3  

You can simplify your code down to

您可以将代码简化为

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

You were trying to access a list element using dictionary syntax. the equivalent of

您试图使用字典语法访问列表元素。相当于

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

It can be confusing when you have lists of dictionaries and keeping the nesting in order.

当你有字典列表并保持嵌套顺序时,可能会让人感到困惑。