2011-12-05 11 views
29

Estoy analizando datos json. No tengo problemas con el análisis y estoy usando el módulo simplejson. Pero algunas solicitudes de API devuelven valor vacío. Aquí está mi ejemplo:Python: Manejar error de decodificación JSON cuando no se devuelve nada

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

Este es el segmento de mi código en el que analizar el objeto JSON:

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

Como ya he mencionado para algunas peticiones que recibo el siguiente error:

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) 

¿Cuál sería la mejor forma de manejar este error?

+2

En realidad, ¿cuál es su pregunta? – Tadeck

+0

Respondió las preguntas;) Parece que envío la pregunta antes de realmente escribir la pregunta. Gracias por la respuesta. –

+2

Ok, me alegro de haber ayudado, ahora parece una telepatía;) Gracias por incluir la pregunta, sin embargo. ¡Buena suerte! – Tadeck

Respuesta

67

Hay una regla en la programación de Python llamada "es más fácil pedir perdón que por permiso" (en resumen: EAFP). Significa que debe detectar excepciones en lugar de verificar los valores de validez.

Por lo tanto, intente lo siguiente:

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' 

EDITAR: Desde simplejson.decoder.JSONDecodeError hereda en realidad de ValueError (proof here), he simplificado la sentencia catch sólo por el uso ValueError.

+3

Siempre debe detectar la excepción correcta. De lo contrario, es posible que falte un error en el código si existe una excepción 'ValueError' real, o alguna otra excepción que también herede de' ValueError'. –

+1

@JulieinAustin: el problema es que en este caso realmente no tiene muchas opciones: el módulo json de stdlib arroja ValueError. – Tadeck

+1

Entonces me mantendría alejado de ese decodificador. La pregunta original era sobre el módulo 'simplejson' y aumenta mucho' JSONDecodeError' en la entrada incorrecta. Vea su enlace anterior. –

Cuestiones relacionadas