2011-12-05 7 views
29

Sto analizzando i dati JSON. Non ho un problema con l'analisi e sto usando il modulo simplejson. Ma alcune richieste API restituiscono un valore vuoto. Qui è il mio esempio:Python: Gestire l'errore di decodifica JSON quando non è stato restituito nulla

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

Questo è il segmento del mio codice dove analizzare l'oggetto JSON:

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

Come ho già detto per alcune richieste che ricevo il seguente errore:

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) 

Quale sarebbe il modo migliore per gestire questo errore?

+2

In realtà, qual è la tua domanda? – Tadeck

+0

Hai risposto alle domande;) Sembra che io abbia presentato la domanda prima di digitare davvero la domanda. Grazie per la risposta. –

+2

Ok, sono contento di aver aiutato - sembra ora una telepatia;) Grazie per aver incluso la domanda, però. In bocca al lupo! – Tadeck

risposta

67

C'è una regola in programmazione Python chiamata "È più facile chiedere perdono che per autorizzazione" (in breve: EAFP). Significa che devi prendere le eccezioni invece di controllare i valori per la validità.

Così, provare quanto segue:

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: Dal simplejson.decoder.JSONDecodeError eredita in realtà da ValueError (proof here), ho semplificato l'istruzione catch da solo utilizzando ValueError.

+3

Si dovrebbe sempre rilevare l'eccezione corretta. Altrimenti potrebbe mancare un bug nel codice se c'è un'eccezione effettiva di "ValueError', o qualche altra eccezione che eredita anche da" ValueError ". –

+1

@JulieinAustin: il problema è che in questo caso non si ha molta scelta: il modulo json di stdlib lancia ValueError. – Tadeck

+1

Quindi starei lontano da quel decoder. La domanda originale riguardava il modulo 'simplejson' e molto fa sollevare' JSONDecodeError' su input errati. Vedi il tuo link precedente. –

Problemi correlati