ti-enxame.com

Lidar com erro de decodificação JSON quando nada retornou

Estou analisando dados json. Não tenho problemas com a análise e estou usando o módulo simplejson. Mas algumas solicitações de API retornam valor vazio. Aqui está o meu exemplo:

{
"all" : {
    "count" : 0,
    "questions" : [     ]
    }
}

Este é o segmento do meu código em que analiso o objeto json:

 qByUser = byUsrUrlObj.read()
 qUserData = json.loads(qByUser).decode('utf-8')
 questionSubjs = qUserData["all"]["questions"]

Como mencionei para alguns pedidos, recebo o seguinte erro:

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)

Qual seria a melhor maneira de lidar com esse erro?

52
add-semi-colons

Existe uma regra na programação Python chamada "é mais fácil pedir perdão do que permissão" (em resumo: EAFP). Isso significa que você deve capturar exceções em vez de verificar valores quanto à validade.

Portanto, tente o seguinte:

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: Como simplejson.decoder.JSONDecodeError realmente herda de ValueError ( prova aqui ), simplifiquei a instrução catch apenas usando ValueError.

111
Tadeck