我在Jupyter Notebooks中使用Python(3.5)向API提出了很多请求。 代码如下:
...
r = requests.post(url=url, json=json, headers=headers)
bar = r.json()["foo"]["bar"]
...
我遇到的问题是,它在大多数时间都能正常工作,但似乎随机抛出类型错误:上面第二行显示“字符串索引必须为整数”。 可能会推断出这意味着返回值是一个简单的字符串/不是JSON对象,因此无法使用键进行访问,但事实并非如此:如果我使用完全相同的请求重新启动(相同的URL,相同的JSON查询,相同标头),则不会引发错误!
它似乎是随机发生的:有时它可以连续处理数千个请求,有时则需要几百次。 知道为什么会发生吗?我一直在寻找答案,但没有找到相关的答案。
注意:我意识到我没有提供可复制的示例,但我不能提供。 我什至无法自己复制该问题,因为它是间歇性发生的。
答案 0 :(得分:0)
这不一定意味着r.json()不是有效的JSON。它可以是如下所示的JSON:
{
"foo": "randomstring"
}
运行r.json()["foo"]["bar"]
时将引发异常,因为r.json()["foo"]
实际上是一个字符串,您需要一个整数才能访问其元素之一。如果它是除字典之外的任何东西,您几乎都会得到一个例外。
对此的快速“解决方案”是将r.json()["foo"]["bar"]
重写为r.json().get("foo", {}).get("bar", None)
。这样,如果JSON没有“ foo”或“ foo”字典没有“ bar”,则返回的值将是None
而不是Exception。
答案 1 :(得分:0)
您可以添加一些错误检查,以找出为什么返回的数据未按预期格式设置:
r = requests.post(url=url, json=json, headers=headers)
try:
data = r.json()
foo = data["foo"]
except json.decoder.JSONDecodeError:
print('response was not a JSON string, but', r.text)
except KeyError:
print('data does not contain "foo", but', data)
else:
try:
bar = foo["bar"]
except KeyError:
print('foo does not contain "bar", but', foo)
except TypeError:
print('foo is not a dictionary, but', foo)