2015-04-30 40 views
1

使用Python 2.7.8,我們得到「ValueError異常:無JSON對象可以解碼」,如果運行此腳本:沒有JSON對象可以檢索使用POST沒有gzip編碼JSON內容之後被解碼

from urllib2 import urlopen, Request 
from json import dumps, loads, load 

values = dumps({ 
    "issueId": 10600, 
    "versionId": "10000", 
    "cycleId": "16", 
    "projectId": 10000 
}) 
headers = {"Content-Type": "application/json"} 
request = Request("http://private-anon-491d363a1-getzephyr.apiary-mock.com/jira_server/rest/zapi/latest/execution", data=values, headers=headers) 
print request.get_method() 
print request.get_header("Content-Encoding") 

response = urlopen(request) 
print "\n" + response.read() 
print response.getcode() 
print response.geturl() 
print response.info() 
json = loads(response.read()) # raises ValueError("No JSON object could be decoded") 

輸出是:

POST 
None 

{ 
    "32": { 
     "id": 32, 
     "executionStatus": "-1", 
     "comment": "", 
     "htmlComment": "", 
     "cycleId": 16, 
     "cycleName": "Audit Test Cycle 3", 
     "versionId": 10000, 
     "versionName": "v1", 
     "projectId": 10000, 
     "issueId": 10600, 
     "issueKey": "ZFJ-19", 
     "summary": "test - check1", 
     "label": "", 
     "component": "" 
    } 
} 
200 
http://private-anon-491d363a1-getzephyr.apiary-mock.com/jira_server/rest/zapi/latest/execution 
Server: Cowboy 
X-Apiary-Ratelimit-Limit: 120 
X-Apiary-Ratelimit-Remaining: 119 
Content-Type: application/json 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT 
Access-Control-Max-Age: 10 
X-Apiary-Transaction-Id: 55423c1c7996e10300e32acc 
Date: Thu, 30 Apr 2015 14:28:45 GMT 
X-Cache: MISS from p-proxy.int.hrs.com 
X-Cache-Lookup: MISS from p-proxy.int.hrs.com:3128 
Via: 1.1 vegur, 1.0 p-proxy.int.hrs.com:3128 (squid/2.6.STABLE6) 
Proxy-Connection: close 

Traceback (most recent call last): 
    File "test2.py", line 20, in <module> 
    json = loads(response.read()) # raises ValueError("No JSON object could be decoded") 
    File "C:\Program Files (x86)\python27\lib\json\__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "C:\Program Files (x86)\python27\lib\json\decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Program Files (x86)\python27\lib\json\decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

我讀了很多Q &一個涉及方面像gzip和requests LIB的,但它是沒有幫助的。我如何使用urlib2json庫解碼響應?如果我將該響應複製到一個文件並解析該文件,它將起作用,因此它是有效的json。

回答

3

您不能.read()類文件對象(即根據docsurlopen返回)兩次。我修改了你的代碼,試試吧:

from urllib2 import urlopen, Request 
from json import dumps, loads, load 

values = dumps({ 
    "issueId": 10600, 
    "versionId": "10000", 
    "cycleId": "16", 
    "projectId": 10000 
}) 
headers = {"Content-Type": "application/json"} 
request = Request("http://private-anon-491d363a1-getzephyr.apiary-mock.com/jira_server/rest/zapi/latest/execution", data=values, headers=headers) 
print request.get_method() 
print request.get_header("Content-Encoding") 

response = urlopen(request) 
text = response.read()   #storing the data 
print "\n" + text    #note the usage of the stored string 
print response.getcode() 
print response.geturl() 
print response.info() 
json = loads(text)    #note the usage of the stored string 
+0

王牌:_You不能.read()類文件對象... twice_ –

0

你應該將內容存儲到一個變量中並解碼該變量。 response.read()的sencod調用將不會獲得任何數據。

簡單的解決方案:

content = response.read() 
json = loads(content) 
相關問題