Python请求JSON间歇性类型错误

时间:2019-03-21 14:07:37

标签: python json python-3.x python-requests

我在Jupyter Notebooks中使用Python(3.5)向API提出了很多请求。 代码如下:

...
r = requests.post(url=url, json=json, headers=headers)
bar = r.json()["foo"]["bar"]
...

我遇到的问题是,它在大多数时间都能正常工作,但似乎随机抛出类型错误:上面第二行显示“字符串索引必须为整数”。 可能会推断出这意味着返回值是一个简单的字符串/不是JSON对象,因此无法使用键进行访问,但事实并非如此:如果我使用完全相同的请求重新启动(相同的URL,相同的JSON查询,相同标头),则不会引发错误!

它似乎是随机发生的:有时它可以连续处理数千个请求,有时则需要几百次。 知道为什么会发生吗?我一直在寻找答案,但没有找到相关的答案。

注意:我意识到我没有提供可复制的示例,但我不能提供。 我什至无法自己复制该问题,因为它是间歇性发生的。

2 个答案:

答案 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)