关于python:打开stackexchange api作为json时,无法解码JSON对象

No JSON object could be decoded when opening stackexchange api as json

我正在访问一个特定的URL来获取JSON文件(来自stackexchange和stackoverflow api)。 执行json.loads()命令时,它显示以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import urllib2
import json

url ="http://api.stackexchange.com/2.1/tags?order=desc&sort=popular&site=quant&pagesize=100&page=1"    
data = json.loads(urllib2.urlopen(url).read())

<ipython-input-20-7540e91a8ff2> in <module>()
----> 1 data = json.loads(urllib2.urlopen(url).read())

/usr/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    336             parse_int is None and parse_float is None and
    337             parse_constant is None and object_pairs_hook is None and not kw):
--> 338         return _default_decoder.decode(s)
    339     if cls is None:
    340         cls = JSONDecoder

/usr/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
    363
    364        """
--> 365         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    366         end = _w(s, end).end()
    367         if end != len(s):

/usr/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
    381             obj, end = self.scan_once(s, idx)
    382         except StopIteration:
--> 383             raise ValueError("No JSON object could be decoded")
    384         return obj, end

ValueError: No JSON object could be decoded

另一方面,twitter api一切正常......为什么?


正如@Thomas所说,这是因为gzip压缩。
我建议使用请求库,担心这种东西:

1
2
3
4
import requests

data_url ="https://api.stackexchange.com/2.1/search?page=1&pagesize=10&order=desc&sort=activity&tagged=pandas&site=stackoverflow"
data_json = requests.get(data_url).json()

StackExchange API总是压缩它的响应,但Python不会自动解压缩它,所以json正在获取gzip压缩数据。

这个答案显示了如何使用gzip模块来处理响应。