2014-10-05 144 views
0

我写了一个简单的程序来解析JSON:蟒蛇JSON解析错误

#! /usr/bin/env python 

import urllib2 
import json 

so = 'https://api.stackexchange.com/2.2/users/507256?order=desc&sort=reputation&site=stackoverflow' 

j = urllib2.urlopen(so) 
print j.read() 
j_obj = json.loads(j.read()) 

它失败,并输出如下:

Traceback (most recent call last): 
    File "./so.sh", line 12, in <module> 
    j_obj = json.loads(j.read()) 
    File "/usr/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 383, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

任何想法,我做错了什么?

回答

3

您无法读取响应两次。删除print行,或将j.read()调用的结果存储在变量中。

然后,堆栈交易所API返回gzip压缩的数据,所以你必须先解压缩它:

import zlib 

j = urllib2.urlopen(so) 
json_data = j.read() 
if j.info()['Content-Encoding'] == 'gzip': 
    json_data = zlib.decompress(json_data, zlib.MAX_WBITS + 16) 

print json_data 
j_obj = json.loads(json_data) 

你可能想切换到使用requests module,它处理JSON和内容编码透明:

import requests 

so = 'https://api.stackexchange.com/2.2/users/507256?order=desc&sort=reputation&site=stackoverflow' 
response = requests.get(so) 
j_obj = response.json()