json データを解析しています。解析に問題はなく、simplejson
モジュールを使用しています。しかし、一部の API リクエストは空の値を返します。これが私の例です:
{
"all" : {
"count" : 0,
"questions" : [ ]
}
}
これは、JSON オブジェクトを解析するコードの部分です。
qByUser = byUsrUrlObj.read()
qUserData = json.loads(qByUser).decode('utf-8')
questionSubjs = qUserData["all"]["questions"]
前述したように、いくつかのリクエストでは次のエラーが発生します。
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)
このエラーを処理する最善の方法は何でしょうか?
ベストアンサー1
Python プログラミングには、「許可を求めるよりも許しを求める方が簡単」(略して EAFP) というルールがあります。これは、値の有効性をチェックするのではなく、例外をキャッチする必要があることを意味します。
したがって、次のことを試してください。
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')
編集: はsimplejson.decoder.JSONDecodeError
実際にはValueError
(を継承しているため証拠はここに) では、 を使用するだけで catch ステートメントを簡略化しましたValueError
。