【问题标题】:Python and JSON - TypeError list indices must be integers not strPython 和 JSON - TypeError 列表索引必须是整数而不是 str
【发布时间】:2014-09-02 17:20:41
【问题描述】:

我正在学习使用 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"
  },
   ]

我只是想打印此 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 问题的问题,我还没有真正理解这一切,所以任何关于我需要做什么的帮助或解释都会令人惊叹。谢谢!

【问题讨论】:

  • 只是一些常见的 Python 智慧 - 请求库 docs.python-requests.org/en/latest 通常是使用 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 or buffer

标签: python json


【解决方案1】:

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

修复该问题后,根据问题顶部的 JSON sn-p,readable_json 将是一个列表,因此 readable_json['firstName'] 毫无意义。获取列表中每个元素的'firstName' 字段的正确方法是去掉playerstuff = readable_json['firstName'] 行并将for i in playerstuff: 更改为for i in readable_json:

【讨论】:

  • 啊哈!谢谢你的解释,这成功了。现在,为了贪婪,我怎样才能在名字旁边用空格打印“lastName”?如果您对 Python 和 API 的教程(从简单开始)有任何建议,我会全力以赴!感谢您的帮助!
  • @user3718365: print i['firstName'], i['lastName']
  • 谢谢!最后一个问题应该让我上路:如果我想列出所有可能的键(即:名字、姓氏、年龄等)以便用户可以输入他们想要查看的内容,我将如何返回键列表(这是正确的词)?另外,我是 StackOverflow 的新手,如果我不应该在问题中添加问题,我很抱歉。
  • @user3718365:你不应该在问题上添加问题,但你的第一个额外问题是微不足道的,我心情很好。获取键列表的最简单方法是readable_json[0].keys(),但这假定列表中的每个元素都具有相同的键集,但这并不总是正确的。
  • readable_json = json.loads(json_obj)[0] 的缺点是什么?
【解决方案2】:

我解决了改变

readable_json['firstName']

通过

readable_json[0]['firstName']

【讨论】:

  • hi = json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) ji = json.loads(hi), ji[0 ]["foo"] Traceback(最近一次调用最后一次):文件“”,第 1 行,在 类型错误:字符串索引必须是整数
【解决方案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"]

当您有字典列表并保持嵌套有序时,这可能会令人困惑。

【讨论】:

  • 谢谢你,它有帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多