web-dev-qa-db-fra.com

Traitement de l'erreur de décodage JSON lorsque rien n'est retourné

Je suis en train d'analyser les données JSON. Je n'ai pas de problème avec l'analyse et j'utilise le module simplejson. Mais certaines requêtes api retournent 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)

Quel serait le meilleur moyen de gérer cette erreur?

52
add-semi-colons

Il existe une règle dans Python appelée "il est plus facile de demander pardon que pour une autorisation" (en bref: EAFP). Cela signifie que vous devez intercepter des exceptions au lieu de vérifier la validité des valeurs.

Ainsi, essayez 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'

[~ # ~] éditer [~ # ~] : Depuis simplejson.decoder.JSONDecodeError _ hérite en fait de ValueError ( preuve ici ), j’ai simplifié l’instruction catch en utilisant simplement ValueError.

111
Tadeck