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?

39
demandé sur Surreal Dreams 2011-12-05 08:58:54

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.

85
répondu Tadeck 2013-01-10 04:59:43