0

我目前正在尝试从一些 JSON 中获取一个值,例如:

bitly_data = "https://api-ssl.bitly.com/v3/link/clicks?access_token=ACCESS_TOKEN&link=http://bit.ly/TCATL"

(读取时,此数据看起来像{"status_code": 200, "data": {"units": -1, "tz_offset": -4, "unit": "day", "link_clicks": 390}, "status_txt": "OK"}

然后我读取数据并尝试将整数值保存link_clicks为变量clicks

src = urllib2.urlopen(bitly_data)
clicks = json.load(src)
clicks = clicks['data']['link_clicks']
print clicks

打印了正确的值clicks(390),尽管我得到了一个 TypeError:'NoneType' object is not subscriptable

整个回溯如下:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/Zach/Dropbox/bitly/bit.py", line 33, in settings
    clicks = clicks['data']['link_clicks']

我很困惑为什么尽管有错误,但我返回了正确的值。我尝试重写有问题的行,clicks = clicks['data']['link_clicks'] or 0但无济于事。我也试着把它变成一个if statementlike,

if clicks['data']['link_clicks'] == None:
     clicks = 0
else:
     clicks = clicks['data']['link_clicks']

但这又没有效果。

提前谢谢了。

4

1 回答 1

2

问题是在这种情况下,返回的 JSON 是:

{u'status_code': 403, u'data': None, u'status_txt': u'INVALID_ACCESS_TOKEN'}

这可能是由于您的 URL 没有正确的访问令牌:

https://api-ssl.bitly.com/v3/link/clicks?access_token=ACCESS_TOKEN&link=http://bit.ly/TCATL

注意它是怎么说access_token=ACCESS_TOKEN的:这可能来自一个演示或教程,希望您将特定的 API 访问令牌放在那里。

正如您在评论中指出的那样,一个短期修复是 put if clicks['data'] == None,但您可能希望解决您的 API 访问令牌的问题。

于 2012-11-01T02:53:43.970 回答