2011-12-05 84 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'。查看您的早期链接。 –

相关问题