我正在解析json数据。解析时我没有问题,我使用的是simplejson
模块。但是一些api请求返回空值。这是我的例子:
{
"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)
处理此错误的最佳方法是什么?
答案 0 :(得分:102)
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
实际上是从ValueError
(proof here)继承的,所以我只使用ValueError
简化了catch语句。
答案 1 :(得分:10)
如果您不介意导入json
模块,那么处理它的最佳方法是通过json.JSONDecodeError
(或json.decoder.JSONDecodeError
相同)来使用默认错误,例如ValueError
还可以捕获不一定与json解码相关的其他异常。
from json.decoder import JSONDecodeError
try:
qByUser = byUsrUrlObj.read()
qUserData = json.loads(qByUser).decode('utf-8')
questionSubjs = qUserData["all"]["questions"]
except JSONDecodeError as e:
# do whatever you want
// EDIT(2020年10月):
正如@Jacob Lee在评论中指出的那样,当JSON对象不是TypeError
,str
或bytes
时,可能会提出基本的公共bytearray
。您的问题是关于JSONDecodeError
的,但在这里还是值得一提。为了处理这种情况,但要区分不同的问题,可以使用以下方法:
from json.decoder import JSONDecodeError
try:
qByUser = byUsrUrlObj.read()
qUserData = json.loads(qByUser).decode('utf-8')
questionSubjs = qUserData["all"]["questions"]
except JSONDecodeError as e:
# do whatever you want
except TypeError as e:
# do whatever you want in this case