Python和JSON错误 - TypeError:字符串索引必须是整数

时间:2016-05-01 22:07:34

标签: python json rest

我收到错误TypeError:解析JSON响应时字符串索引必须是整数。我不明白我做错了什么,回复是字典..

我的代码示例,它从可测试的免费REST API中获取相同的错误:

import requests

response = requests.get('http://services.groupkt.com/state/get/IND/all')

for states in response.json():
    print ('{} {}'.format(states['name'], states['capital']))

4 个答案:

答案 0 :(得分:2)

当您遍历字典时,会迭代其键。该词典的(唯一)顶级键是" RestResponse"并且您的代码转换为:"RestResponse"["name"]。由于它是一个字符串,Python期待整数索引(例如" RestResponse" [3]用于切片)。

如果您调查结果字典的结构,您会看到所需的结果位于response.json()["RestResponse"]["result"]下:

for states in response.json()["RestResponse"]["result"]:
    print ('{} {}'.format(states['name'], states['capital']))

输出:

Andhra Pradesh Hyderabad, India
Arunachal Pradesh Itanagar
Assam Dispur
Bihar Patna
Chhattisgarh Raipur
...

答案 1 :(得分:0)

您的回复不是数组,而是对象 代码中的for循环实际上是在dict(JSON对象的解析版本)中的键遍历。

答案 2 :(得分:0)

当您在response.json()上进行迭代时,您只是在str RestResponse上进行迭代,这是你词典中的第一个元素。

因此,您应该按如下方式更改代码:

for states in response.json()['RestResponse']['result']:
    print ('{} {}'.format(states['name'], states['capital']))

然后,您的输出将是:

Andhra Pradesh Hyderabad, India
Arunachal Pradesh Itanagar
Assam Dispur
Bihar Patna
Chhattisgarh Raipur
Goa Panaji
Gujarat Gandhinagar
Haryana Chandigarh
Himachal Pradesh Shimla
...

答案 3 :(得分:0)

您想要的结果位于"RestResponse" => "result"

"RestResponse" : {
    "messages" : [...]
    "result" : [ {}, {}, {} ... ]
}

因此,要获得状态,您应该获得result数组的值。

request = requests.get('http://services.groupkt.com/state/get/IND/all')
response = request.json()
states = response["RestResponse"]["result"]

现在你可以做到:

for state in states:
    print ('{} {}'.format(state['name'], state['capital']))

输出应符合预期。