【问题标题】:ValueError: No JSON object could be decoded, but positive <Response [200]>ValueError: 没有 JSON 对象可以被解码,但是是肯定的 <Response [200]>
【发布时间】:2013-04-08 15:39:25
【问题描述】:

我正在浏览一些 URL,我可以从我正在使用的 API 中获取大部分数据。 *Imgur API。然而,当它发现一张之前发布过但最终被删除的图片时,它仍然显示一个积极的 URL 获取响应(代码 200),并且当我使用

    j1 = json.loads(r_positive.text)

我收到此错误:

http://imgur.com/gallery/cJPSzbu.json
<Response [200]>
Traceback (most recent call last):
  File "image_poller_multiple.py", line 61, in <module>
    j1 = json.loads(r_positive.text)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

我怎样才能“获取” j1 变量中的错误?我想使用条件结构来解决问题并避免我的程序崩溃。像

if j1 == ValueError:
  continue
else:
  do_next_procedures()

【问题讨论】:

  • 您的示例 URL 给了我一个 302 Found,将我重定向到 imgur.com/cJPSzbu。你确定它是 200 OK 吗?

标签: python json url


【解决方案1】:

您需要改用try except

try:
    j1 = json.loads(r_positive.text)
except ValueError:
    # decoding failed
    continue
else:
    do_next_procedures()

请参阅 Python 教程中的 Handling Exceptions

真正发生的是,您被重定向到该 URL,而您获得的是图像页面。如果您使用 requests 获取 JSON,请查看 the response history

if r_positive.history:
    # more than one request, we were redirected:
    continue
else:
    j1 = r_positive.json()

或者你甚至可以禁止重定向:

r = requests.post(url, allow_redirects=False)
if r.status == 200:
    j1 = r.json() 

【讨论】:

  • 一如既往,@martijn,绝妙的建议,控制结构的基本 Python 流程之一。顺便说一句,恭喜你获得了 100K!
  • 不应该将continue 改为pass(Python 的noop 语句)吗?循环外的continue 语句在 Python 2.7 上是 SyntaxError(异常处理块不是循环)。
  • @rsanchezsaez:OP 有一个continue 语句,所以我假设发布的 sn-p 是一个更大的循环代码块的一部分。
  • @MartijnPieters 哦,我刚刚注意到,你是对的。尽管如此,我认为将pass 用于异常处理示例将使其更普遍适用于Python 初学者。 ;-)
【解决方案2】:

您列出的 URL 会将您重定向到 HTML 页面。 (使用curl 来检查这样的事情,他是你的朋友。)

HTML 页面显然无法解析为 JSON。

你可能需要的是这个:

response = fetch_the_url(url)
if response.status == 200:
  try:
    j1 = json.loads(response.text)
  except ValueError:
    # json can't be parsed
    continue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多