Python: Gérer L'erreur de décodage JSON quand rien n'est retourné
J'analyse les données json. Je n'ai pas de problème avec l'analyse et j'utilise le module simplejson
. Mais certaines demandes d'api renvoient une valeur vide. Voici mon exemple:
{
"all" : {
"count" : 0,
"questions" : [ ]
}
}
C'est le segment de mon code où j'analyse l'objet json:
qByUser = byUsrUrlObj.read()
qUserData = json.loads(qByUser).decode('utf-8')
questionSubjs = qUserData["all"]["questions"]
Comme je l'ai mentionné, pour certaines demandes, j'obtiens l'erreur suivante:
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)
Quelle serait la meilleure façon de gérer cette erreur?
1 réponses
Il y a une règle dans la programmation Python appelée "Il est plus facile de demander pardon que D'obtenir la Permission" (En bref: EAFP). Cela signifie que vous devriez attraper des exceptions au lieu de vérifier la validité des valeurs.
Essayez donc ce qui suit:
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'
EDIT: Depuis simplejson.decoder.JSONDecodeError
réellement hérite de ValueError
(la preuve ici), j'ai simplifié l'instruction catch en utilisant simplement ValueError
.