2011-12-05 110 views
29

我正在解析json數據。我沒有解析問題,我正在使用simplejson模塊。但是一些API請求返回空值。這是我的例子:Python:在沒有任何返回時處理JSON解碼錯誤

{ 
"all" : { 
    "count" : 0, 
    "questions" : [  ] 
    } 
} 

這是我解析JSON對象我的代碼段:

qByUser = byUsrUrlObj.read() 
qUserData = json.loads(qByUser).decode('utf-8') 
questionSubjs = qUserData["all"]["questions"] 

正如我對一些請求我收到以下錯誤提到:

Traceback (most recent call last): 
    File "YahooQueryData.py", line 164, in <module> 
    qUserData = json.loads(qByUser) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/__init__.py", line 385, in loads 
    return _default_decoder.decode(s) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 420, in raw_decode 
    raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) 

處理這個錯誤的最好方法是什麼?

+2

其實,你的問題是什麼? – Tadeck

+0

你回答了問題;)看起來我真的在提問之前提交了問題。感謝你的回答。 –

+2

好吧,我很高興我的幫助 - 它現在看起來像一個心靈感應;)謝謝你包括這個問題,雖然。祝你好運! – Tadeck

回答

67

Python程序設計中有一條規則叫做「它容易要求寬恕而不是權限」(簡稱EAFP)。這意味着你應該捕獲異常而不是檢查有效性的值。

因此,請嘗試以下操作:

try: 
    qByUser = byUsrUrlObj.read() 
    qUserData = json.loads(qByUser).decode('utf-8') 
    questionSubjs = qUserData["all"]["questions"] 
except ValueError: # includes simplejson.decoder.JSONDecodeError 
    print 'Decoding JSON has failed' 

編輯:由於simplejson.decoder.JSONDecodeError實際上是從ValueErrorproof here)繼承,我只要使用ValueError簡化了catch語句。

+3

你應該總是抓住正確的例外。否則,如果存在實際的「ValueError」異常,或者某些其他異常也從「ValueError」繼承,那麼您可能會錯過代碼中的錯誤。 –

+1

@JulieinAustin:問題是,在這種情況下,你真的沒有太多的選擇 - stdlib的json模塊拋出ValueError。 – Tadeck

+1

然後我會遠離那個解碼器。原來的問題是關於'simplejson'模塊,它在輸入錯誤時會引發'JSONDecodeError'。查看您的早期鏈接。 –

相關問題